在unix中的模式匹配上使用连续行交换

时间:2012-09-14 10:23:30

标签: perl unix sed awk swap

任何人都可以帮助我在sed / awk / perl

中对其进行排序

输入文件

Start variable 1
End   variable 2
A
Z
Next 

Start variable b
End   variable a 
X
Y
Next 
...
...
...

Start variable m
End   variable n
M
N
Next

如果找到匹配End的模式,请与其连续行交换

输出文件:

Start variable 1
A
End variable 2 
Z
Next

Start variable b
X
End variable a
Y
Next
...
...
...

Start variable m
M
End variable n
N
Next

3 个答案:

答案 0 :(得分:3)

sed解决方案:

sed -n '/^End\s/{h;n;p;g};p' inputfile

答案 1 :(得分:2)

Simple Perl解决方案。 $n代表“现在”,$b代表“之前”,即“前一行是结束”。

perl -ne 'print unless $n = /^End$/; print "End\n" if $b; $b = $n'

对于问题的更新版本,只需添加$l即可记住要打印的行:

perl -ne 'print unless $n = /^End /; $l = $_ if $n ; print $l if $b; $b = $n'

或者,等同但更短:

perl -ne '$n = /^End / and $l = $_ or print; $b and print $l; $b = $n'

答案 2 :(得分:0)

 sed -n '/^End/{h;n;G};p' inputfile

这会做+