文件就像这样
>>
>>-- @@@@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:
答案 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;