CLI:在字符串中递增数字,同时保留填充的零

Hap*_*ace 1 regex string perl command-line sed

我目前使用此perl命令来增加字符串中的最后一个数字:

perl -pe 's/(\d+)(?!.*\d+)/$1+1/e' <<< "abc123_00456.txt"
Run Code Online (Sandbox Code Playgroud)

它输出abc123_457.txt,而我想要abc123_00457.txt

我也想99增加到100,尽管如果太难了00也是可以接受的。

我想要的其他一些示例:

09 -> 10
004 -> 005
Run Code Online (Sandbox Code Playgroud)

我还希望能够增加任意数量(不只是1),所以不可以++

我不想使用shell的内置函数来完成此任务。

mel*_*ene 5

尝试这个:

perl -pe 's/(\d+)(?=\D*\z)/my $n = $1; ++$n/e' <<< "abc123_00456.txt"
Run Code Online (Sandbox Code Playgroud)

递增字符串时,++运算符将保留位数

或者:

perl -pe 's/(\d+)(?=\D*\z)/sprintf "%0*d", length($1), $1 + 1/e' <<< "abc123_00456.txt"
Run Code Online (Sandbox Code Playgroud)

这样一来,您就可以增加不止1(或执行其他算术运算)。

sprintf %d用十进制格式格式化整数。0表示用零填充结果;*表示最大字段宽度取自下一个参数,而不是格式字符串本身。(例如,%05d意思是“通过用零填充数字来格式化数字,直到其宽度至少为5个字符”。)

在这里,我们只是简单地获取原始数字串(length($1))的长度,并将其用作字段宽度。要格式化的数字是$1 + 1。如果比原始字符串短,则sprintf自动添加零。

另请参阅perldoc -f sprintf