sed comand在第一场比赛后没有取代价值

时间:2016-04-14 18:59:47

标签: sed ubuntu-14.04

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

  1. sudo sed -e '/cfg_file/cfg_file='$NEW_FILE -e '/cfg_file/cfg_file=/q' MAIN_CONF_FILE
  2. sudo sed -i '0,/cfg_file/ a\cfg_file='$NEW_FILE $MAIN_CONF_FILE
  3. sudo sed -i '1s/cfg_file/cfg_file='$NEW_FILE $MAIN_CONF_FILE
  4. sudo sed -i '1/cfg_file/s/cfg_file='$NEW_FILE $MAIN_CONF_FILE
  5. 不幸的是,没有什么对我有用。如果是第3点,它们会显示错误,或者在每次匹配后显示类似的添加行的行为。

    样本文件

    cfg_file=some_line1
    cfg_file=some_line2
    

    现在我想在第一次匹配cg_file后添加一行,如下所示。

    预期结果

    cfg_file=some_line1
    cfg_file=my_added_line_after_first_match_only.
    cfg_file=some_line2
    

    帮助我在第一场比赛后添加线并纠正我的命令。

1 个答案:

答案 0 :(得分:2)

由于您使用的是Ubuntu,因此您使用的是GNU sed。 GNU sed有一些奇怪的功能和一些有用的功能;你应该忽略那些奇怪的并使用有用的那些。

在上下文中,有用的是从第0行开始的范围。奇怪的是它与aic命令混淆的方式。

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脚本行。

工作中的例子

$ 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
$

这是基于你的尝试2,但避免了一些奇怪的东西。

基本理智

在我noted时,尝试使用sudo-i选项sed是不明智的。在您知道脚本将正确完成工作之前,您不会使用它们。通过root执行sudo任何操作都很危险。当你不知道你想要使用的是否会起作用时,这是非常危险的。不要冒险破坏你的系统。