Perl Regex命令行问题

All*_*len 9 regex bash perl

我试图在命令行中的perl中使用负前瞻:

echo 1.41.1 | perl -pe "s/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g"
Run Code Online (Sandbox Code Playgroud)

得到一个看起来像这样的增量版本:

1.41.2
Run Code Online (Sandbox Code Playgroud)

但它只是返回我:

![0-9]+\.[0-9]+\.: event not found
Run Code Online (Sandbox Code Playgroud)

我已经在regex101(PCRE)中试过了,效果很好,所以我不确定为什么它在这里不起作用

rua*_*akh 6

在Bash中,!是“ 历史记录扩展字符”,但用反斜杠或单引号引起来的除外。(双引号不会禁用此功能;也就是说,双引号内支持历史记录扩展。请参见Bash中单引号和双引号之间的区别

因此,只需将双引号更改为单引号即可:

echo 1.41.1 | perl -pe 's/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g'
Run Code Online (Sandbox Code Playgroud)

和voilà:

1.41.2
Run Code Online (Sandbox Code Playgroud)


zdi*_*dim 5

如果要“ 递增 ”一个数字,则无法对新值进行硬编码,但需要捕获其中的内容并递增该值

echo "1.41.1" | perl -pe's/[0-9]+\.[0-9]+\.\K([0-9]+)/$1+1/e'
Run Code Online (Sandbox Code Playgroud)

在这里,/e修饰符使替换面作为代码进行评估,然后我们可以+1捕获所捕获的数字,然后将其替换。该\K所以我们并不需要把它们放回下降以前的比赛; 请参见perlre中扩展模式中的“环视断言 ” 。

环视有时只是您想要的东西,但它们却增加了正则表达式的复杂性(仅由于存在而已),可能难以正确执行,并影响了效率。这里不需要它们。

您得到的奇怪输出是因为Perl程序周围使用的双引号“邀请”了外壳程序以查看内部内容,从而解释了!历史扩展并对其进行了运行,如ruakh的帖子所述。