簡體   English   中英

查找字符倍數包圍的文本

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

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