2

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

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

所需的输出:

aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
4

4 回答 4

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
于 2013-09-27T11:28:38.580 回答
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
于 2013-09-27T11:30:03.097 回答
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
于 2013-09-27T11:31:47.827 回答
0

这可能对您有用(GNU sed):

sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file
于 2013-09-27T19:30:16.647 回答