如何删除所有文件(包括子目录中的注释)的注释?

如何删除所有文件(包括子目录中的注释)的注释?

要删除中的注释(以#和开头/* 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 {} ';'
  1. g全局搜索

  2. d删除

  3. x保存并关闭

相关内容