2012-09-14 25 views
-1

任何一个可以帮助我在SED/AWK/perl的交换用在UNIX模式匹配一​​个连续行

输入文件

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 
+0

如何定义两个连续行的结束? 'A'''End'''End'产生'End'''End'''''或'End'''''''End'? – amon

回答

2

简单的Perl的解决方案。 $n代表“now”,$b代表“之前”,即“前一行是End”。

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' 

或者,equivalen但较短:

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

对不起,请您再次检查我的问题,END不是固定字符串 – user1228191

+1

@ user1228191:请参阅更新。 – choroba

+0

真的,我想努力明白,让我们说如果我们将我们的输入文件读入数组,如何在输出文件格式中安排数组的内容与该一个班轮代码的帮助..我可以请帮助做到这一点 – user1228191

3

sed解决方案:

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

这会做+