2015-06-20 117 views
0

如何删除最后一次出现的字符串之前的所有行。就像如果我有一个看起来像删除字符串的最后一个字母之前的所有行

 
Icecream is good 
And 
Chocolate is good 
And 
They have lots of sugar 

如果我想毕竟行的文件,并包括“和”什么是做到这一点的干净的方式最后一次出现?具体而言,我想

And 
They have lots of sugar 

我在做sed -n -E -e '/And/,$p' file但我认为这给了我第一次出现。

+0

添加所需输出为样本输入。 – Cyrus

+0

请看看:[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers) – Cyrus

回答

3

这可能为你工作(GNU SED):

sed -n '/And/h;//!H;$!d;x;//p' file 

替换含有And行保留空间什么。将所有其他行追加到保留空间。在文件末尾,交换保存空间的模式空间,并打印出结果,只要它匹配所需的字符串And即可。

+0

谢谢,这工作! – jyu429

+0

看看[这个评论](http://stackoverflow.com/questions/30958584/delete-all-lines-before-last-case-of-a-string#comment49950428_30958584);) – bagrat

+1

你不只是做'sed -n'/ And/h; H; $ {x; p}'' – 123

0

我知道你要求sed,而且波通提供了一个很好的sed解决方案。但是,作为比较,这里是一个awk的解决方案:

$ awk 's{s=s"\n"$0;} /And/{s=$0;} END{print s;}' file 
And 
They have lots of sugar 

它是如何工作的:

  • s{s=s"\n"$0;}

    如果变量s不为空,然后添加到它当前行, $0

  • /And/{s=$0;}

    如果当前行包含And,然后设置s当前行,$0

  • END{print s;}

    后,我们已经达到了文件的末尾,打印s

-2
$ tac file | awk '!f; /And/{f=1}' | tac 
And 
They have lots of sugar 

$ awk 'NR==FNR{if(/And/)nr=NR;next} FNR>=nr' file file 
And 
They have lots of sugar 
+1

请提供说明。 –

+0

不,这是从阅读任何awk文档的页面或2中可以获得的非常基本的东西,但是我会很乐意回答任何人在花费一点努力为自己弄明白之后所提出的任何问题。 –

+1

谁在乎它是多么的基础。作为一个有这么多点的人,你应该很熟悉SO礼仪。你的问题被标记为质量。由于这是正确的,我所做的只是发表评论。你不能指望人们只是“读一页或两页”......如果你能这样做,那么它就不会那么受欢迎。事实是,正确与否,你的回答很糟糕。你应该修复它。 –

相关问题