grep文件中的一行然后删除该行

时间:2015-02-21 14:48:54

标签: string bash awk sed grep

$ cat example.txt

收率:

example
test
example

我想删除' test'此文件中的字符串。

$ grep -v test example.txt > example.txt 
$ cat example.txt 
$

以下作品,但我觉得有更好的方法!

$ grep -v test example.txt > example.txt.tmp;mv example.txt.tmp example.txt 
$ cat example.txt 
example
example

值得注意的是,这将是一个超过10,000行的文件。

干杯

3 个答案:

答案 0 :(得分:5)

你正在以正确的方式进行,但在mv之前使用&&以确保grep成功或者你将删除原始文件:

grep -F -v test example.txt > example.txt.tmp && mv example.txt.tmp example.txt

我还添加了-F选项,因为您说要删除字符串,而不是正则表达式。

你可以使用sed -i,但是你需要担心找出和/或转义sed分隔符,sed不支持搜索字符串,所以你需要尝试逃避所有可能的正则表达式字符组合你的搜索字符串试图使sed将它们视为文字字符(由于正则表达式字符的位置敏感特性,你不能自动化的过程)以及所有它可以节省你手动命名你的tmp文件,因为sed在内部使用了一个。

哦,另外一个选择 - 你可以使用GNU awk 4. *和“inplace editing”。它也像sed一样在内部使用tmp文件,但它确实支持字符串操作,所以你不需要尝试转义RE元字符,并且它没有分隔符作为语法的一部分来担心:

awk -i inplace -v rmv="test" '!index($0,rmv)' example.txt

任何grep / sed / awk解决方案都会在10000行文件中眨眼。

答案 1 :(得分:2)

你可以使用sed,

sed -i '/test/d' example.txt

-i保存对该文件所做的更改。所以你不需要使用重定向操作符。

-i[SUFFIX], --in-place[=SUFFIX]
             edit files in place (makes backup if SUFFIX supplied)

答案 2 :(得分:-1)

cat example.txt | grep -iv测试> example.txt