查找由字符多次包含的文本

时间:2013-03-08 09:19:11

标签: regex perl

问题:

@

所包含的文件中查找文本

输入:

@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

对不起我的不完整性。谢谢Kluther

5 个答案:

答案 0 :(得分:1)

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

你可以使用(@.*?@)使其变得非贪婪。但是,更好的方法是匹配之间不是@的所有内容:

 (@[^@]*@)

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

perl -ne 'BEGIN { $/ = undef; } print $1 while(/(\@[^@]*\@)/gs); print "\n"'

答案 1 :(得分:0)

使用这样的模式

@[a-zA-Z]+@

答案 2 :(得分:0)

使用此正则表达式:

cat test.txt | perl -pe 's/(?:(@ )|^[^@]).*?(?: (@)|$)/$1$2/g'

答案 3 :(得分:0)

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

cat test.txt | perl -ne 'BEGIN { $/ = undef; } print $1." " while(/(\@([^@]*)\@)/gsm); print "\n";'

答案 4 :(得分:0)

一种方式:

$ perl -pe '@a=$_=~/@[^@]+@/g; $_="@a";' file
@abc@ @ABC@ @cba@