[英]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.