递归查找并删除所有文件中的行

递归查找并删除所有文件中的行

我已经设法通过使用来 grep 关键字的出现

grep "KeyWord" . -r -n -i -I 

但是,KeyWord 的出现次数太多。我只想删除所有包含该词的行。

我搜索了一下,sed 看起来是个实用工具。谁能告诉我哪个命令可以解决问题?

谢谢。

答案1

使用 GNU sed:

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

使用 OSX sed:

find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d

第一个命令find找到所有标准文件(不是目录、管道等),并以分隔符打印它们\0(因此文件名可以包含空格、换行符等)。

第二条命令xargs读取的输出find,根据分隔符(\0因为-0)获取列表,并sed -i [...]使用列表中添加的参数进行调用(sed如果有很多文件,则会被多次调用,因为每次调用中参数的最大长度是有限的)。

sed命令就地修改(-i)。

至于/KeyWord/d,它将删除包含正则表达式的行KeyWord

您应该学会sed正确理解(简单但不寻常的)语法,并参考相应的手册页以获取有关此处涉及的工具的更多信息。


正如我喜欢推广的那样zsh,解决方案及其扩展的 glob:

sed -i /KeyWord/d **/*(.)

答案2

你可以在 Ex 模式下使用 Vim:

find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
  1. g全局搜索

  2. d删除

  3. x保存并关闭

答案3

我最初是用 来grep查找文件,因此感觉稍微修改一下比切换到 更安全一些find

$ grep -l -r KeyWord * | xargs sed -i /KeyWord/d

grep -l将打印文件名,sed -i并将编辑它们。

相关内容