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

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

我想向 Makefile 添加一系列命令来附加配置行当他们尚未出现时。我过去曾以如下方式完成此操作:

grep -vq "keyword" /a/b/c.conf && echo "abc keyword" >> /a/b/c.conf

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

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

grep -vq "keyword" /a/b/c.conf && echo "the line is absent"

... 印刷该行不存在 仅有的当线路实际上不存在时。并且,echo命令是正确的不是当该行被执行时展示。

我缺少什么?


笔记:为了便于阅读,上面的示例进行了精简。事实上,类似的命令还会有很多。这是我尝试过的特定命令:

grep -vq "md_module" /etc/httpd/conf.modules.d/00-ssl.conf && echo "LoadModule md_module module/mod_md.so" >> /etc/httpd/conf.modules.d/00-ssl.会议

答案1

问题是grep -v会匹配线与表达式不匹配的文件,而不是与表达式不匹配的文件...

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

更好的方法是使用积极的匹配关键字,然后根据需要使用||(而不是&&) 附加该行:

grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf

你的测试可能会echo "the line is absent"说它不存在,但实际上它不存在......如果是这样的话,也许什么也不做仅有的线。如果您进一步测试这一点,我想您会发现只要它确实有任何与关键字不匹配的行,您就会得到匹配项。

我希望这能澄清这一点!

相关内容