使用 sed 匹配并向配置文件添加新行会产生重复行

使用 sed 匹配并向配置文件添加新行会产生重复行

我正在尝试构建一个与 CONFIG_BLUE 匹配的 sed 查询,然后在其下方添加 CONFIG_GREEN 。我所做的查询有效,但结果是同一行重复两次。

sed查询;

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test.txt

例子;

CONFIG_BLUE=y
CONFIG_GREEN=y
CONFIG_GREEN=y (This shouldn't be here)

我对正则表达式非常生疏。知道我做错了什么吗?

脚本中的循环片段(允许 test1.txt、test2.txt 等)当前仅使用 1 个文件,尚未扩展到更多文件。

for i in test*.txt
do
  sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test.txt
done

答案1

假设您使用的是 GNU ,您的循环将在文件中正则表达式的每次匹配之后sed附加一行。它将在同一文件中为当前目录中与 shell 通配模式匹配的每个文件名重复添加同一行。# CONFIG_GREEN=yCONFIG_BLUEtest.txttest*.txt

要在 中获取两行添加的文本test.txt,则可以

  1. test*.txt当前目录中存在文件名匹配的另一个文件,或者
  2. 甚至在运行循环之前,文本行就已经存在于文件中,可能来自先前的运行,或者
  3. 您没有运行您认为正在运行的代码。

判断从评论,这是这三个案例中的第二个。

要完成对循环的修改,请在实际调用中使用循环变量sed

for name in test*.txt; do
  sed -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' "$name"
done

目前,我已经删除了-iGNU 的选项,sed以允许您检查结果并重新运行而不修改任何文件。请注意,如果您有合理数量的文件,则可以sed直接使用文件名通配模式进行调用,以依次对所有文件进行操作。如果您使用的是 GNU ,您也可以-i在这里进行就地编辑。sed

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test*.txt

相关内容