我想从给定目录中的所有文件中删除整行文本。我知道我可以使用grep -v foo filename
一次执行此文件。而且我知道我可以使用grep -r foo
以递归方式搜索目录。如何组合这些命令以从目录中的所有文件中删除给定的文本行?
答案 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
选项略有不同,因此您需要添加扩展名。该文件被解释为命令,这就是您看到该错误的原因。