sed 命令在第一次匹配后不替换值
sed comand is not replacing value after first match
我正在尝试在第一次匹配后使用 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
帮助我在第一次匹配后添加行并更正我的命令。
由于您使用的是 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,但避免了一些奇怪的东西。
基本理智
作为我,尝试sudo
和sed
的-i
选项是不明智的。在您知道脚本将正确完成工作之前,您不会使用它们。通过 sudo
作为 root
做任何事情都是危险的。当您不知道您尝试使用的东西是否有效时,这是双重危险的。不要冒险破坏您的系统。
我正在尝试在第一次匹配后使用 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
帮助我在第一次匹配后添加行并更正我的命令。
由于您使用的是 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,但避免了一些奇怪的东西。
基本理智
作为我sudo
和sed
的-i
选项是不明智的。在您知道脚本将正确完成工作之前,您不会使用它们。通过 sudo
作为 root
做任何事情都是危险的。当您不知道您尝试使用的东西是否有效时,这是双重危险的。不要冒险破坏您的系统。