如果不存在,则在文件中追加一行

svi*_*gen 3 grep make echo text-processing

我想向 Makefile 添加一系列命令,当它们不存在时附加配置行我过去曾这样做过:

grep -vq "keyword" /a/b/c.conf && echo "abc keyword" >> /a/b/c.conf
Run Code Online (Sandbox Code Playgroud)

但是,我显然忽略了一些东西。命令原样导致在重新运行时重复配置行。

手动测试显示该模式按预期工作:

grep -vq "keyword" /a/b/c.conf && echo "the line is absent"
Run Code Online (Sandbox Code Playgroud)

...当该行实际不存在 时才打印该行不存在。并且,echo正确命令不是当线是执行本。

我错过了什么?


注意:上面的例子是为了可读性而精简的。现实中,类似的命令会有很多。这是我尝试过的特定命令:

grep -vq "md_module" /etc/httpd/conf.modules.d/00-ssl.conf && echo "LoadModule md_module modules/mod_md.so" >> /etc/httpd/conf.modules.d/00-ssl.配置文件

fil*_*den 5

问题是,grep -v将匹配线不表达匹配不匹配它,而不是文件...

因此,如果您的文件有任何不匹配的grep -v行,将匹配这些行,因此 grep 将成功返回。

更好的方法是对关键字使用肯定匹配,然后在需要时使用||(而不是&&)附加该行:

grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf
Run Code Online (Sandbox Code Playgroud)

echo "the line is absent"当它确实不存在时,您可能会在测试中说它不存在......如果这是唯一的一行,也许什么都不做。如果你进一步测试,我想你会发现只要它有任何与关键字不匹配的行,你就会得到匹配。

我希望这能澄清它!