[英]Find text enclosed by character multiples times
問題:
在@
包圍的文件中查找文本
輸入:
@abc@ abc @ABC@
cba @cba@ CBA
輸出:
@abc@ @ABC@
@cba@
我嘗試了以下方法:
cat test.txt | perl -ne 'BEGIN { $/ = undef; } print $1 if(/(@.*@)/s)."\n"'
但這導致:
@abc@ abc @ABC@
cba @cba@
另外:我還不完整。 上面的目標是用其他字符替換@之間的字符:a應該變成chr(0x430)b應該變成chr(0x431)c應該變成chr(0x446)A應該變成chr(0x410)B應該變成chr( 0x411)C應該成為CHR(0x426),所以在考慮上述輸入應該導致: абц abc АБЦ
cba цба CBA
對不起,我不完整。 謝謝克盧瑟
(@.*@)
的問題在於*
貪婪:它與最大數量匹配。 因此,它將匹配字符串中第一個@
和最后一個@
之間的所有內容。
您可以使用(@.*?@)
使其不貪婪。 但是,更好的方法是匹配介於兩者之間的所有@
:
(@[^@]*@)
如果要匹配每個匹配項而不是第一個匹配項,則還需要使用/g
修飾符並修改代碼以使用循環:
perl -ne 'BEGIN { $/ = undef; } print $1 while(/(\@[^@]*\@)/gs); print "\n"'
使用這樣的模式
@[a-zA-Z]+@
使用此正則表達式:
cat test.txt | perl -pe 's/(?:(@ )|^[^@]).*?(?: (@)|$)/$1$2/g'
使用非貪婪搜索.+?
或/(\\@([^@]*)\\@)/gsm
。
cat test.txt | perl -ne 'BEGIN { $/ = undef; } print $1." " while(/(\@([^@]*)\@)/gsm); print "\n";'
單程:
$ perl -pe '@a=$_=~/@[^@]+@/g; $_="@a";' file
@abc@ @ABC@ @cba@
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.