我正在尝试构建一个与 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=y
CONFIG_BLUE
test.txt
test*.txt
要在 中获取两行添加的文本test.txt
,则可以
test*.txt
当前目录中存在文件名匹配的另一个文件,或者- 甚至在运行循环之前,文本行就已经存在于文件中,可能来自先前的运行,或者
- 您没有运行您认为正在运行的代码。
判断从评论,这是这三个案例中的第二个。
要完成对循环的修改,请在实际调用中使用循环变量sed
。
for name in test*.txt; do
sed -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' "$name"
done
目前,我已经删除了-i
GNU 的选项,sed
以允许您检查结果并重新运行而不修改任何文件。请注意,如果您有合理数量的文件,则可以sed
直接使用文件名通配模式进行调用,以依次对所有文件进行操作。如果您使用的是 GNU ,您也可以-i
在这里进行就地编辑。sed
sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test*.txt