删除最后一个字符串之前的所有行

时间:2015-06-20 20:31:01

标签: bash sed

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

的文件一样
Icecream is good
And
Chocolate is good
And
They have lots of sugar

如果我想要在“And”的最后一次出现之后包括所有行,那么最干净的方法是什么?具体来说,我想要

<ul>

我正在做And They have lots of sugar ,但我看到这给了我第一次出现。

3 个答案:

答案 0 :(得分:5)

这可能适合你(GNU sed):

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

用包含And的行替换保留空间中的任何内容。将所有其他行追加到保留空间。在文件末尾,交换保留空间的模式空间,并在结果与所需字符串And匹配时打印出结果。

答案 1 :(得分:1)

我知道你要求sed并且Potong提供了一个很好的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 :(得分:-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