Perl:在RE中添加匹配的字符串

时间:2015-08-12 05:49:15

标签: regex perl

这是一个perl RE,它会在尖括号中增加一个数字。

echo "aaa build<23>bbb')"|perl -p -e 's/^(.*build<)(\d+)(>.*)$/$2 + 1/e;'
24

如何获得此效果并保留尖括号前后的线条内容?只需添加$1$3即可。

echo "aaa build<23>bbb')"|perl -p -e 's/^(.*build<)(\d+)(>.*)$/$1$2 + 1$3/e;'
Scalar found where operator expected at -e line 1, near "$1$2"
    (Missing operator before $2?)
Scalar found where operator expected at -e line 1, near "1$3"
    (Missing operator before $3?)
syntax error at -e line 1, near "$1$2 "

4 个答案:

答案 0 :(得分:2)

我使用\K和积极向前看。

echo "aaa build<23>bbb')"| perl -p -e 's/^(?:.*build<)\K(\d+)(?=>.*$)/$1 + 1/e;'

DEMO

  • \K会丢弃先前在匹配时打印的匹配字符。
  • (?=>.*$)肯定前瞻,断言匹配必须跟随某些字符。

答案 1 :(得分:2)

仅将<>之间的第一个号码增加一个:

echo "aaa build<23>bbb')" | perl -pE 's/(?<=<)(\d+)(?=>)/$1 + 1/e'

有关perldoc perlre(?<=PATTERN)的说明,请参阅(?=PATTERN)。 (提示:在perlre中搜索&#39;回顾断言。)

答案 2 :(得分:1)

您可以像这样使用捕获的组:

echo "aaa build<23>bbb')"|perl -pe 's/^(.*build<)(\d+)(>.*)$/$1 . ($2+1) . $3/e;'
aaa build<24>bbb')
  • 使用DOT连接字符串变量
  • 使用+`
  • 进行数学运算

答案 3 :(得分:0)

类似于@Avinash Raj,但是TIMTOWTDI :-)

在我看来,这个解决方案更接近问题。使用正向前瞻和后瞻性断言,而不是像往常一样(通过将每个^$括起来)来匹配整行:

 echo "aaa build<23>bbb')"|perl -p -e 's/(?<=build<)(\d+)(?=>)/$1 + 1/e;'

哪个给出了

aaa build<24>bbb')

如果您希望在一行中出现多次build<>表达式,请使用g修饰符。