2012-12-13 323 views
3

以下命令将查找所有字符串的发生并删除找到该字符串的文件的内容。如何grep整行,传递给sed,并删除行?

find/-maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l {} \; -exec sed -i '/./d' {} \; 

我已经尝试修改它只是删除找到该字符串的行,但无法使其正常工作。

如测试文件:

blah blah blah 
blah blah blah teststring 
teststringblah blah blah 
blah blah blah 

它会删除线2,3和离开该文件作为无线之间的差距:

blah blah blah 
blah blah blah 

回答

7

无需grep这里sed -i '/teststring/Id' file删除file所有行其中包含teststring(不区分大小写)所以刚刚与find合并:

find . -maxdepth 1 -xdev -type f -exec sed -i '/teststring/Id' {} \; 

sed演示:

$ cat file 
blah blah blah 
blah blah blah teststring 
teststringblah blah blah 
blah blah blah 

$ sed '/teststring/Id' file 
blah blah blah 
blah blah blah 
+1

Doh,我有一个额外的转义字符哈哈。感谢那。 – user1166981

+0

没问题,乐意帮忙! –

0

符合标准的脚本工具的地方你不能编辑文件。您可以创建一个新文件,然后用新的替换旧的文件:

#get a temporary filename 
tmp_file_name=$(mktemp) 
grep -v teststring $my_file_name > $tmp_file_name 
mv $tmp_file_name $myfile_name 
+1

是的,你可以用ed或sed -i或者你可以用awk编码或者.... Alsom你需要引用你的变量。正如你写的脚本会失败的文件名称空间或通配符。 –

+0

引用变量的优点。不知道我是如何错过sed -i,因为它是在原始问题。出于某种原因,我避免了像瘟疫一样的awk。 –

+0

你应该再看看awk。它是处理文本的最有用的UNIX工具,可让您编写最清晰,最简单,最易于维护和可扩展的程序。 –