我正在尝试在perl命令行中使用负向前瞻:
echo 1.41.1 | perl -pe "s/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g"
获取一个类似于这样的增量版本:
1.41.2
然而它只是返回给我:
![0-9]+\.[0-9]+\.: event not found
我在 regex101(PCRE) 上尝试过它,结果很好,所以我不确定为什么它在这里不起作用。
!
是“历史扩展字符”,除非使用反斜杠或单引号进行转义。(双引号不会禁用此功能;也就是说,在双引号内支持历史扩展。请参阅Bash中单引号和双引号的区别)echo 1.41.1 | perl -pe 's/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g'
并且,就这样:
1.41.2
set +H
来禁用 !
历史扩展。而 shopt -s histreedit
则允许你编辑失败的历史扩展,而不仅仅是将输入的命令丢弃。 - melpomene([0-9.]+)\.([0-9]+)
perl -e'
my $name = "1.41.1";
$name =~ s/([0-9.]+)\.([0-9]+)/$1\.2/;
print "$name\n";
'
1.41.2
echo "1.41.1" | perl -pe's/[0-9]+\.[0-9]+\.\K([0-9]+)/$1+1/e'
/e
修饰符使得替换部分被评估为代码,我们可以对捕获的数字进行+1
,然后进行替换。 \K
会丢弃先前的匹配项,因此我们不需要将它们放回; 参见“Perlre中的扩展模式”中的Lookaround Assertions。(\d+)\.(\d+)\.(\d+)
\1.\2.\3
仅将第三部分替换为数字"2"即可:
\1.\2.2
为了适应楼主的问题,它将是:
$ echo 1.14.1 | perl -pe 's/(\d+)\.(\d+)\.(\d+)/\1.\2.2/'
1.14.2
$
\K
匹配并丢弃即可)--s/[0-9]+\.[0-9]+\.\K([0-9]+)/$1+1/e;
- zdim