-1

文件是这样的

>>
>>-- @@@@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:
4

2 回答 2

2

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

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

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

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

于 2013-07-23T10:54:09.393 回答
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; 
于 2013-07-23T10:57:44.010 回答