首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除最后出现的图案后的所有行?

如何删除最后出现的图案后的所有行?
EN

Stack Overflow用户
提问于 2017-06-01 13:15:36
回答 7查看 1.3K关注 0票数 5

我想删除最后一次出现模式之后的所有行,除了模式本身。

file.txt

代码语言:javascript
复制
honor
apple
redmi
nokia
apple
samsung
lg
htc

file.txt我想要的

代码语言:javascript
复制
honor
apple
redmi
nokia
apple

我试过的

代码语言:javascript
复制
sed -i '/apple/q' file.txt

这将删除第一次出现模式后的所有行-

代码语言:javascript
复制
honor
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-06-01 14:04:40

使用几乎没有内存的简单、健壮的2次传递方法:

代码语言:javascript
复制
$ awk 'NR==FNR{if (/apple/) hit=NR; next} {print} FNR==hit{exit}' file file
honor
apple
redmi
nokia
apple

如果没有足够快地执行,那么就应该尝试一些替代方案,看看是否会产生性能改进。

票数 7
EN

Stack Overflow用户

发布于 2017-06-01 13:19:06

反转文件,从模式的第一次出现开始打印所有内容,然后反转结果:

代码语言:javascript
复制
tac file.txt | sed -n '/apple/,$p' | tac > newfile.txt

您可以找到最后一次匹配的行号,然后使用它打印文件的前N行:

代码语言:javascript
复制
line=$(awk '/apple/ { line=NR } END {print line}')
head -n $line file.txt > newfile.txt
票数 5
EN

Stack Overflow用户

发布于 2017-06-01 13:25:46

如果您不想像Barmar建议的那样反转该文件,您必须使用较低级别的工具(例如,file )反向读取该文件,或者读取它两次:

代码语言:javascript
复制
sed $(awk '/apple/{a=NR}END{print a+1}' input),\$d input

(请注意,如果模式未出现在文件中,则不会输出任何内容。这是一个你应该担心的边缘问题。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44308594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档