将grep -v与grep -r结合使用?

时间:2015-08-10 19:35:42

标签: grep

我想从给定目录中的所有文件中删除整行文本。我知道我可以使用grep -v foo filename一次执行此文件。而且我知道我可以使用grep -r foo以递归方式搜索目录。如何组合这些命令以从目录中的所有文件中删除给定的文本行?

3 个答案:

答案 0 :(得分:1)

尝试类似:

grep -vlre 'foo' . | xargs sed -i 's/pattern/replacement/g'

细分:

grep:
  -v 'Inverse match'
  -l 'Show filename'
  -r 'Search recursively'
  -e 'Extended pattern search'

xargs: For each entry perform

sed -i: replace inline 

答案 1 :(得分:1)

查找文件的UNIX命令名为find,而不是grep。忘了你曾经听说过grep -r,因为它只是一个坏主意,这是查找文件并对它们执行某些操作的正确方法:

find . -type f -print | xargs sed -i '/badline/d'

答案 2 :(得分:0)

我认为这样可行:

grep -ilre 'Foo' . | xargs sed -i 'extension' 'Foo/d'

其中'extension'是指文件名的添加。它将使用您指定的扩展名制作原始文件的副本,并且修改后的文件将具有原始文件名。我添加了-i,以防您需要它不区分大小写。

修改后的file1变为“file1” 原始文件1变为“file1extension”

invalid command code ., despite escaping periods, using sed

其中一个回复表明OSX中较新版本的sed -i选项略有不同,因此您需要添加扩展名。该文件被解释为命令,这就是您看到该错误的原因。