![如何删除所有文件(包括子目录中的注释)的注释?](https://linux22.com/image/1269296/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%88%E5%8C%85%E6%8B%AC%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%B3%A8%E9%87%8A%EF%BC%89%E7%9A%84%E6%B3%A8%E9%87%8A%EF%BC%9F.png)
要删除中的注释(以#
和开头/* comment */
)settings.php
,以下命令就可以了:
sed '/^\#/d' settings.php > outp.txt
mv outp.txt settings.php
sed '/\/\*/,/*\//d; /^\/\//d; /^$/d;' settings.php > outp2.txt
mv outp2.txt settings.php
sed '/^$/d' settings.php > outp3.txt
mv outp3.txt settings.php
但是如何删除所有文件(包括子目录中的注释)的注释?
答案1
从您想要遍历的目录开始,您可以使用find ./ -type f -name '*.php' -print0 | xargs -0 sed -i '/^\#/d'
。xargs 为 sed 构建参数列表以获得更好的性能,并且 sed 的 -i 选项会就地替换模式(您不必使用重定向)。
编辑:根据手册页寻找 find ./ -name '*.php' -type f -print0 | xargs -0 sed -i '/^\#/d'
甚至更快,因为它不调用统计在每个文件上(-type 选项)。
答案2
您可以使用 -i 来“就地”执行 sed。您可以像这样用分号连接 sed 命令:“c1;c2;c3”您可以使用 find 执行命令 - 无需 | xargs。
find ./somedir -name "*.php" -execdir sed -i '/^\#/d;/\/\*/,/*\//d; /^\/\//d; /^$/d;;/^$/d' {} +
这适用于 Linux 上的 gnu-find;也许您的 find 没有 -execdir,-exec 也应该可以工作,也许它没有 +,那么“;”将是一个简单但不是那么快的解决方案,或者使用上面 p.vitzliputzli 所示的 xargs,并使用 Matt 对带有空格和特殊字符的文件名的改进是一种替代方法。
答案3
你可以在 Ex 模式下使用 Vim:
find -name '*.php' -exec ex -sc g/^#/d -cx {} ';'
g
全局搜索d
删除x
保存并关闭