我希望删除模式最后一次出现后的所有行,除了模式本身
file.txt的
honor
apple
redmi
nokia
apple
samsung
lg
htc
Run Code Online (Sandbox Code Playgroud)
file.txt我想要的
honor
apple
redmi
nokia
apple
Run Code Online (Sandbox Code Playgroud)
我试过的
sed -i '/apple/q' file.txt
Run Code Online (Sandbox Code Playgroud)
这会在第一次出现模式后删除所有行 -
honor
Run Code Online (Sandbox Code Playgroud)
使用几乎没有内存的简单,强大的2遍方法:
$ awk 'NR==FNR{if (/apple/) hit=NR; next} {print} FNR==hit{exit}' file file
honor
apple
redmi
nokia
apple
Run Code Online (Sandbox Code Playgroud)
如果这个执行速度不够快,那么就该尝试一些替代方案,看看是否会产生性能提升.
反转文件,从第一次出现的模式开始打印所有内容,然后反转结果:
tac file.txt | sed -n '/apple/,$p' | tac > newfile.txt
Run Code Online (Sandbox Code Playgroud)
您可以找到最后一个匹配的行号,然后用它来打印文件的前 N 行:
line=$(awk '/apple/ { line=NR } END {print line}')
head -n $line file.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)