在文件中首次出现特定字符串之前删除所有行

mtv*_*ezy 9 bash awk sed

基本上我有一个像这样的文件:

junk
morejunk
somestring
bats
car
somestring
bats
car
somestring
bats
car
Run Code Online (Sandbox Code Playgroud)

并且我想junk在第一次出现之前删除所有somestring文件,因此文件看起来像

somestring
bats
car
somestring
bats
car
somestring
bats
car
Run Code Online (Sandbox Code Playgroud)

我按照这个问题的建议使用,sed -i '0,/somestring/,d' file.txt但是somestring当我想将该行保留为第一行时,它会删除第一次出现的行.

l'L*_*L'l 11

sed你可以使用:

sed -i '/somestring/,$!d' file
Run Code Online (Sandbox Code Playgroud)

替换表达式的说明:

, 匹配从第一个地址匹配的行开始,并继续直到第二个匹配(包含).

$ 匹配最后一个输入文件的最后一行,或者指定-i或-s选项时每个文件的最后一行.

! 如果字符在地址范围之后,则仅选择与地址范围不匹配的行.

d删除模式空间; 立即开始下一个周期.

结果:

$ sed -i '/somestring/,$!d' file
somestring
bats
car
somestring
bats
car
somestring
bats
car
Run Code Online (Sandbox Code Playgroud)