在perl中,用换行符替换最后一个匹配项的更有效方法是什么?

时间:2015-03-19 20:33:12

标签: regex perl

我想替换

hi@my@name@is@foo

进入

hi@my@name@is
foo

这是" \ n"的最后一个@字符。这是我的尝试性解决方案,但我觉得这可以做得更好。

echo "hi@my@name@is@foo"| perl -pe '$_ = reverse($_);s/@/\n/;$_=reverse($_)'

4 个答案:

答案 0 :(得分:5)

在Perl 5.10.0及更高版本中,你可以使用\K,它实际上是一个可变长度的后视:

echo "hi@my@name@is@foo"| perl -pe 's/.*\K@/\n/'

答案 1 :(得分:3)

您可以使用(.*)捕获截至上一个@的所有内容,因为它是贪婪的。

s/(.*)@/\1\n/

答案 2 :(得分:2)

我喜欢消极的前瞻:

echo "hi@my@name@is@foo"| perl -pe 's/@(?!.*@)/\n/'

......但是好的,\K还是更短。 :)

答案 3 :(得分:1)

你需要的是rindex

 echo "hi@my@name@is@foo" | perl -ne ' $cnt=rindex($_,"@");
 print substr($_,0,$cnt)."\n".substr($_,$cnt+1)."\n";'