0

问题:

在包含的文件中查找文本片段@

输入:

@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

对不起我的不完整。谢谢克鲁瑟

4

5 回答 5

1

问题(@.*@)在于它*是贪婪的:它匹配尽可能多的数量。因此它将匹配@字符串中第一个和最后一个之间的所有内容。

您可以使用(@.*?@). 但是,更好的方法是匹配不在@两者之间的所有内容:

 (@[^@]*@)

如果您想匹配每一个匹配项而不是第一个匹配项,您还需要使用/g修饰符并修改您的代码以使用循环:

perl -ne 'BEGIN { $/ = undef; } print $1 while(/(\@[^@]*\@)/gs); print "\n"'
于 2013-03-08T09:32:15.497 回答
0

像这样使用模式

@[a-zA-Z]+@
于 2013-03-08T09:21:55.777 回答
0

使用这个正则表达式:

cat test.txt | perl -pe 's/(?:(@ )|^[^@]).*?(?: (@)|$)/$1$2/g'
于 2013-03-08T09:26:26.380 回答
0

使用非贪婪搜索.+?/(\@([^@]*)\@)/gsm.

cat test.txt | perl -ne 'BEGIN { $/ = undef; } print $1." " while(/(\@([^@]*)\@)/gsm); print "\n";'
于 2013-03-08T09:27:48.893 回答
0

单程:

$ perl -pe '@a=$_=~/@[^@]+@/g; $_="@a";' file
@abc@ @ABC@ @cba@
于 2013-03-08T09:31:09.587 回答