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

bsm*_*moo 4 string bash awk grep sed

$ cat example.txt
Run Code Online (Sandbox Code Playgroud)

产量:

example
test
example
Run Code Online (Sandbox Code Playgroud)

我想从此文件中删除'test'字符串.

$ grep -v test example.txt > example.txt 
$ cat example.txt 
$
Run Code Online (Sandbox Code Playgroud)

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

$ grep -v test example.txt > example.txt.tmp;mv example.txt.tmp example.txt 
$ cat example.txt 
example
example
Run Code Online (Sandbox Code Playgroud)

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

干杯

Avi*_*Raj 12

你可以使用sed,

sed -i '/test/d' example.txt
Run Code Online (Sandbox Code Playgroud)

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

-i[SUFFIX], --in-place[=SUFFIX]
             edit files in place (makes backup if SUFFIX supplied)
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 7

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

grep -F -v test example.txt > example.txt.tmp && mv example.txt.tmp example.txt
Run Code Online (Sandbox Code Playgroud)

我还添加了-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
Run Code Online (Sandbox Code Playgroud)

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