问题:
在@
输入:
@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
答案 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@