sed删除上次找到的匹配项以上的所

时间:2015-03-30 14:22:36

标签: linux bash unix sed

我有一个文件:users.txt,如下所示:

    Name
    Jack
    Name
    Jackson
    Name
    Peter

我需要删除 ABOVE 找到的{strong>最后匹配Name,以便文件如下所示:

    Name
    Peter

我试过在网上搜索,但只找到可以实现此目的的awk命令。 我需要 sed 才能使用-i选项进行保存。当使用awk重定向>标准输出时,我发现文件有时是空的。

非常感谢您的时间和帮助。

5 个答案:

答案 0 :(得分:4)

您可以tac使用awk两次:

tac file | awk '{print} /Name/{exit}' | tac
Name
Peter

答案 1 :(得分:3)

通过sed,

tac file | sed -n '0,/Name/p' | tac

答案 2 :(得分:1)

使用不sed的{​​{1}}:

tac
  • 当看到sed -n '/Name/h; //!H; ${g;p}' file 时,请用当前行替换保留空间
  • 当看不到Name时,当前行附加到保留空间
  • 在最后一行,将图案空间替换为保留空间并打印。

由于我们在管道中没有Name,您可以使用sed替换该文件。

答案 3 :(得分:0)

全部在awk

awk 'x{x=x"\n"$0}/Name/{x=$0}END{print x}' file

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed 'H;/Name/h;$!d;x' file

在保留空间中保持匹配,并在文件末尾打印最后一个匹配的保留空间。