我想在第一次匹配后使用sed在文件中添加一行。我在线看了我的线程,解决了同样的问题并尝试了以下版本的命令:
sudo sed -e '/cfg_file/cfg_file='$NEW_FILE -e '/cfg_file/cfg_file=/q' MAIN_CONF_FILE
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点,它们会显示错误,或者在每次匹配后显示类似的添加行的行为。
样本文件
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
帮助我在第一场比赛后添加线并纠正我的命令。
答案 0 :(得分:2)
由于您使用的是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
脚本行。
$ 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
任何操作都很危险。当你不知道你想要使用的是否会起作用时,这是非常危险的。不要冒险破坏你的系统。