繁体   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