Text-Processing
如果不存在,將行附加到文件
我想在 Makefile 中添加一系列命令,*當它們不存在時附加配置行。*我過去以這樣的方式做到了這一點:
grep -vq "keyword" /a/b/c.conf && echo "abc keyword" >> /a/b/c.conf
但是,我顯然忽略了一些東西。命令 as-is 會導致重新執行時復製配置行。
手動測試顯示該模式按預期工作:
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 modules/mod_md.so” >> /etc/httpd/conf.modules.d/00-ssl.會議
問題是
grep -v
它將匹配與表達式不匹配的行,而不是與它不匹配的文件……因此,如果您的文件有任何不匹配的行,
grep -v
將匹配這些行,因此 grep 將返回成功。更好的方法是對關鍵字使用正匹配,然後在需要時使用
||
(而不是&&
)附加該行:grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf
echo "the line is absent"
當它確實不存在時,您可能會在測試中說它不存在……如果這是唯一的一條線,也許什麼也不做。如果你進一步測試,我想你會發現只要它有任何不匹配關鍵字的行,你就會得到匹配。我希望這能澄清它!