这是一个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 "
答案 0 :(得分:2)
我使用\K
和积极向前看。
echo "aaa build<23>bbb')"| perl -p -e 's/^(?:.*build<)\K(\d+)(?=>.*$)/$1 + 1/e;'
\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')
答案 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
修饰符。