sed comand不会在第一次匹配后替换值

sed comand不会在第一次匹配后替换值,sed,ubuntu-14.04,Sed,Ubuntu 14.04,我试图在第一次匹配后使用sed在文件中添加一行。我在线查看了我的线程,解决了相同的问题,并尝试了以下版本的命令: sudo sed-e'/cfg\u file/cfg\u file='$NEW\u file-e'/cfg\u file/cfg\u file=/q'主配置文件 sudo sed-i'0,/cfg_file/a\cfg_file='$NEW_file$MAIN_CONF_file sudo sed-i'1s/cfg_file/cfg_file='$NEW_file$MAIN_CONF

我试图在第一次匹配后使用sed在文件中添加一行。我在线查看了我的线程,解决了相同的问题,并尝试了以下版本的命令:

  • sudo sed-e'/cfg\u file/cfg\u file='$NEW\u file-e'/cfg\u file/cfg\u file=/q'主配置文件
  • sudo sed-i'0,/cfg_file/a\cfg_file='$NEW_file$MAIN_CONF_file
  • sudo sed-i'1s/cfg_file/cfg_file='$NEW_file$MAIN_CONF_file
  • sudo sed-i'1/cfg_file/s/cfg_file='$NEW_file$MAIN_CONF_file
  • 不幸的是,对我来说什么都不管用。在第3点的情况下,它们要么显示错误,要么显示在每次匹配后添加行的类似行为

    示例文件

    现在我想在cg_文件的第一次匹配之后添加一行,如下所示

    预期结果


    请帮助我在第一次匹配后添加行并更正我的命令。

    因为您在Ubuntu上,所以您使用的是GNU
    sed
    。GNU
    sed
    有一些奇怪的特性和一些有用的特性;你应该忽略那些奇怪的,而使用那些有用的

    在上下文中,有用的是从第0行开始的范围。奇怪的是它处理
    a
    i
    c
    命令的方式

    MAIN_CONF_FILE=/tmp/copy.of.main.config.file
    NEWFILE="my_added_line_after_first_match_only."
    
    sed -e '0,/^cfg_file=/ { /^cfg_file/ a\' \
        -e "cfg_file=$NEWFILE" \
        -e '}' \
        "$MAIN_CONF_FILE"
    
    在经典的
    sed
    中,
    a
    命令后面紧跟着反斜杠换行符,脚本的每一个后续行都会追加到第一行,并且包括第一行,最后没有反斜杠(反斜杠被删除)。每个
    -e
    参数在脚本中充当一行。区分以反斜杠结尾的转义shell行和以反斜杠结尾的
    sed
    脚本行

    工作中的榜样 这是基于你的尝试2,但避免了一些奇怪的东西

    基本理智
    与我一样,尝试使用
    sudo
    -I
    选项
    sed
    是不明智的。在您知道脚本将正确完成任务之前,您不会使用这些。通过
    sudo
    执行root之类的操作是危险的。如果你不知道你想用的东西是否有效,那就更加危险了。不要冒险破坏您的系统。

    编辑您的问题,从语句中删除
    replace
    add
    我正在尝试替换添加一行
    并添加一个。另外,请添加一个示例输入和预期输出。否则,很难判断需要对命令进行哪些更改。是否要在与模式匹配的第一行之后添加一行,并且仅在匹配的第一行之后添加一行?不要尝试使用
    sudo
    -i
    选项。在文件副本上进行实验,将结果保存到临时文件夹。只有当你知道它会起作用时,你就要冒使用<代码> SUDO 和<代码> -i>代码>的作用。但是我应该试试@ JONATAN谢谢你的建议吗?乔纳森,我会考虑这个错误,第25行:/opt/GNU/BI/SED:没有这样的文件或目录,我在这里保存我的GNU<代码> SED 的副本;只要把作业改成
    SED=SED
    ,你就可以了。我试过了,但还是没有成功;(
    sed-e'0,/^cfg\u file=/{/^cfg\u file/a\'-e“cfg\u file=$NEW\u file”\-e'}“$MAIN\u CONF\u file”
    很抱歉,但是睡觉时间到了。如果您使用我显示的文件,使用显示的shell脚本,并修复
    sed
    的位置,然后运行它,您是否会得到与我显示的不同的结果?如果是,您最好解释一下您得到了什么。如果您的问题是将其调整到更现实的示例中,那么您可能需要需要展示更现实的例子。
    cfg_file=some_line1
    cfg_file=my_added_line_after_first_match_only.
    cfg_file=some_line2
    
    MAIN_CONF_FILE=/tmp/copy.of.main.config.file
    NEWFILE="my_added_line_after_first_match_only."
    
    sed -e '0,/^cfg_file=/ { /^cfg_file/ a\' \
        -e "cfg_file=$NEWFILE" \
        -e '}' \
        "$MAIN_CONF_FILE"
    
    $ cat /tmp/copy.of.main.config.file | so
    cfg_file=some_line1
    cfg_file=some_line2
    $ cat script.sh
    MAIN_CONF_FILE=/tmp/copy.of.main.config.file
    NEWFILE="my_added_line_after_first_match_only."
    
    SED=/opt/gnu/bin/sed
    
    ${SED} \
        -e '0,/^cfg_file=/ { /^cfg_file/ a\' \
        -e "cfg_file=$NEWFILE" \
        -e '}' \
        "$MAIN_CONF_FILE"
    $ bash script.sh
    cfg_file=some_line1
    cfg_file=my_added_line_after_first_match_only.
    cfg_file=some_line2
    $