如何仅使用最后一次出现的正则表达式打印该行?


0

我有一个(大)文件有多次出现的表达式SCF Done,我(现在)只对这些行的最后一行感兴趣。目前我正在使用管道命令:

sed -n '/SCF Done/p' <filename> | sed '$!d'

我想以某种方式组合它来替换该命令,但我还是无法这样做。具体来说,我想要<filename>最后。有没有办法做到这一点?

虽然我更喜欢使用sed的解决方案,但我对其他命令行工具持开放态度。

Answers:


2

通常,每个sed命令都使用相同的源数据,并且看不到彼此的更改。当使用shell来管道时,这不是问题。如果您不想使用shell来管道输出,那么您必须使用保持缓冲区。

这应该做你想要的事情:

 sed '/SCF Done/h;g;$!d' <filename>

这将每个匹配放入保持缓冲区(h)。然后,在读取整个文件后,它读取保持缓冲区(the g)并仅打印最后一行(the $!d)。

我认为这可以进一步优化,如果你能弄清楚如何让它真正替换每个马赫上的整个缓冲区,但我把它固定为你的练习。这也可以让你摆脱这;$!d部分。


这样可以解决吗?用g替换x。
krowe 2015年

1
是的,谢谢。我现在可以继续锻炼了;)
马丁 - マーチン

-1

只打印最后一行管道 tail -n num_lines

例如,只获取最后一行

sed -n '/SCF Done/p' <filename> | sed '$!d' | tail -n 1


我使用的命令只产生一条线,因为它是多余的,所以不必将它连接到尾部。我想首先摆脱管道。
马丁 - マーチン

你能举个例子吗?星期一早上,我的大脑还在睡觉。
Dan

我想摆脱管道或子壳,只需将第一个sed命令与第二个命令结合起来。
马丁 - マーチン
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.