簡體   English   中英

Perl一根襯板可去除多條線

[英]Perl one liner to remove multiple line

輸入文件是

<section_begin>  mxsqlc


*** WARNING[13052] Cursor C is not fetched.
<section_end>
<section_begin>  b2.lst
*


*** WARNING[13052] Cursor C is not fetched.

0 errors, 1 warnings in SQL C file "b2.ppp".
<section_end>
<section_begin>  b2s0
SQLCODE=0
SQLSTATE=00000
a=10, b=abc, c=20
SQLCODE=0
SQLSTATE=00000
a=10, b=abc      , c=10, d=xyz      
<section_end>

期望輸出沒有下面的行。

<section_end>
<section_begin>  b2s0

我的代碼是

perl -ne 'print unless /^\<section_end\>(\s*|.*lst)?\s*$/' b2exp

它刪除所有<section_end>行,並且不刪除此行<section_begin> *.lst

把事情簡單化

perl -ne 'print unless /^\<section_/' b2exp

有點復雜

perl -ne 'print unless /^\<section_(end|begin)\>/' b2exp

嗯,您的問題不清楚。 (對我來說,也許是真的)

我現在將其讀為“我在開頭部分標記了<section_begin> tagname ,在結尾部分標記了</section_end> 。我希望排除示例中帶有特定標記名的部分bs20 。我希望保留所有標記。其他行

perl -ne 'BEGIN {$p=1}  $p=0 if /section_begin.*b2s0/; print if $p; $p=1 if /<section_end>/;' ex.txt

如果打算將具有lst的部分與下一部分合並(並在下一部分的begin標記后的同一行中刪除內容),那么我將改用Awk。

awk '/<section_end>/ && lst { next }
    /<section_begin>/ && lst { lst=0; next }
    /<section_begin>.*lst/ {lst=1}
    1' b2exp

當然,在Perl中可以完成相同的操作; perl -0777 -pe 's/.../.../s' file是最簡單的單行代碼,由於緩沖,其內存效率要低得多。

perl -0777 -pe 's%(<section_begin>[^\n]*lst.*?)\n<section_end>\n<section_begin>[^\n]%$1%s' b2exp

這會將整個文件讀入內存( -0777 ),並替換多行正則表達式。 貪婪的比賽.*? 將使匹配盡可能短,即不跨越模式其余部分的匹配(換行符,結束標簽,換行符,開始標簽,可選地后面跟非換行數據)。 我們也要小心使用[^\\n] ,因為/s標志變為,所以我們希望在同一行上保持匹配. 可以匹配換行符的通配符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM