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


14

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

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

但是,关键字的出现次数过多。我只想删除包含该单词的所有行。

我四处搜寻,sed看起来像是实用程序。谁能告诉我什么命令可以解决这个问题?

谢谢。

Answers:


25

使用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由于-0sed -i [...]获取列表,从列表中添加参数调用(sed如果有很多文件,则将多次调用,因为参数的最大长度受限制)每次调用)。

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

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

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


正如我要推广的那样zsh,具有扩展glob的解决方案:

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

仅删除“关键字”一词怎么样。而不是整条线?
SurenNihalani

s/KeyWord//gKeyWord用”(空字符串)替代g所有(不仅是每行的第一个)
Pierre Carrier,

1

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

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

  2. d 删除

  3. x 保存并关闭


在给我的OSX中find: illegal option -- t,必须添加. find . -type f -exec ex -sc g/KeyWord/d -cx {} ';'
Erik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.