我正在尝试在文件中搜索模式的最后一次出现并删除包含最后一个模式的行之后的所有内容。我想知道是否可以使用 awk 或 sed。提前致谢。
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
所需的输出:
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
我正在尝试在文件中搜索模式的最后一次出现并删除包含最后一个模式的行之后的所有内容。我想知道是否可以使用 awk 或 sed。提前致谢。
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
eeeeee fffff gggg
qqqq eeee rrrr
所需的输出:
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
tac
救援:
$ tac b | awk '/pattern/ {p=1}p' | tac
aaaaaa bbbbb cccccc
aaaaaa pattern dddddd
tac
确实连接并反向打印文件。awk
代码在我对您上一个问题的回答中进行了解释,删除模式之前的所有内容,包括使用 awk 或 sed 的模式。另一个例子:
$ 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
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
我有这条线,应该可以满足您的要求:
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
这可能对您有用(GNU sed):
sed -r '/pattern/{x;/./p;d};x;/./!{x;b};x;H;$!d;x;P;d' file