在文件中搜索模式的最后一次出现,并在删除模式行之后删除所有内容

时间:2013-09-27 11:25:23

标签: unix sed awk html-table

我正在尝试搜索文件中最后一次出现的模式,并删除包含最后一个模式的行之后的所有内容。我想知道它是否可能使用awk或sed。在此先感谢。

aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr 

期望的输出:

aaaaaa bbbbb cccccc
aaaaaa pattern dddddd

4 个答案:

答案 0 :(得分:7)

tac救援:

$ tac b | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd

另一个例子:

$ cat a
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd
qqqq eeee rrrr
$ tac a | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
aaaaaa pattern dddddd

答案 1 :(得分:2)

awk '
    BEGIN { ARGV[ARGC++] = ARGV[ARGC-1] }
    NR==FNR { if (/pattern/) lastLine = NR; next }
    { print }
    FNR == lastLine { exit }
' file

要演示postfix如何在上面工作(请参阅下面的评论):

$ awk 'BEGIN{ i=3; a[i++] = i; for (j in a) print j, a[j]; print i }'
3 3
4

答案 2 :(得分:1)

我有这条线,应该符合您的要求:

awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' file

我做了一个小测试:

kent$  cat f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr 
aaaaaa pattern dddddd
111
222

kent$  awk '/pattern/{_=NR}{a[NR]=$0}END{for(i=1;i<=_;i++)print a[i]}' f
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr 
aaaaaa pattern dddddd

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file