我想删除最后一次出现模式之后的所有行,除了模式本身。
file.txt
honor
apple
redmi
nokia
apple
samsung
lg
htcfile.txt我想要的
honor
apple
redmi
nokia
apple我试过的
sed -i '/apple/q' file.txt这将删除第一次出现模式后的所有行-
honor发布于 2017-06-01 14:04:40
使用几乎没有内存的简单、健壮的2次传递方法:
$ awk 'NR==FNR{if (/apple/) hit=NR; next} {print} FNR==hit{exit}' file file
honor
apple
redmi
nokia
apple如果没有足够快地执行,那么就应该尝试一些替代方案,看看是否会产生性能改进。
发布于 2017-06-01 13:19:06
反转文件,从模式的第一次出现开始打印所有内容,然后反转结果:
tac file.txt | sed -n '/apple/,$p' | tac > newfile.txt您可以找到最后一次匹配的行号,然后使用它打印文件的前N行:
line=$(awk '/apple/ { line=NR } END {print line}')
head -n $line file.txt > newfile.txt发布于 2017-06-01 13:25:46
如果您不想像Barmar建议的那样反转该文件,您必须使用较低级别的工具(例如,file )反向读取该文件,或者读取它两次:
sed $(awk '/apple/{a=NR}END{print a+1}' input),\$d input(请注意,如果模式未出现在文件中,则不会输出任何内容。这是一个你应该担心的边缘问题。)
https://stackoverflow.com/questions/44308594
复制相似问题