Perl one liner在多条线上找到并替换它

时间:2013-07-23 10:41:48

标签: regex perl

文件就像这样

>>
>>-- @@@@EOC@@@@;
>>select * from t1030a1;

A1  B1          C1  D1     
--  ----------  --  -------

A   steven      C   walter 
D   melissa     C   7      
E   monica      Q   sue    
A   t1030a1     C   C++    
A   t1030a1     C   C++    

--- 5 row(s) selected.
>>
>>-- @@@@EOC@@@@;
>>log;

预期产出:

>>select * from t1030a1;

A1  B1          C1  D1     
--  ----------  --  -------

A   steven      C   walter 
D   melissa     C   7      
E   monica      Q   sue    
A   t1030a1     C   C++    
A   t1030a1     C   C++    

--- 5 row(s) selected.
>>log;

我试图显示2行>>\n>>-- @@@@EOC@@@@;但它不起作用。

MXX:`perl -ne 'print if />>\n>>-- \@\@\@\@EOC\@\@\@\@\;/' a1log`
MXX:

2 个答案:

答案 0 :(得分:2)

你的单行无效的原因是它跨越两行,但你当时读了一行文件。所以它永远不会匹配。您需要将文件作为单行读取才能执行此操作。但是,为什么不这样做:

perl -ne 'print unless /^>>(\s*|-- @@.*)$/'

我使用.*来填充该行的其余部分,因为它对于有限的样本数据是不必要的。如果你需要它,你可以使用你已经拥有的正则表达式,看起来它会起作用。

如果你想尝试自己的单行,你可以添加开关-0777并查看它是否匹配。

答案 1 :(得分:0)

逃避@符号使它工作,虽然我不太清楚为什么。

$ perl -ne 'print if ($_ !~ /^>>(-- \@\@\@\@EOC\@\@\@\@;)?\s*$/)' < test.log 
>>select * from t1030a1;

A1  B1          C1  D1     
--  ----------  --  -------

A   steven      C   walter 
D   melissa     C   7      
E   monica      Q   sue    
A   t1030a1     C   C++    
A   t1030a1     C   C++    

--- 5 row(s) selected.
>>log;