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

时间:2019-07-06 11:51:29

标签: regex string perl sed command-line

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

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

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

我还希望将99之类的内容增加到100,尽管如果太难了,00也可以接受。

我想要的其他一些例子:

09 -> 10
004 -> 005

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

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

4 个答案:

答案 0 :(得分:5)

尝试一下:

<select>
  <option style="display:none">Click to Check Files</option>
  <optgroup label="See the filenames below"></optgroup>
  <optgroup label="file1"></optgroup>
  <optgroup label="file2"></optgroup>
  <optgroup label="file2"></optgroup>
</select>

增加字符串时,perl -pe 's/(\d+)(?=\D*\z)/my $n = $1; ++$n/e' <<< "abc123_00456.txt" 运算符preserves the number of digits

或者:

++

这使您可以增加1以上(或执行其他算术运算)。

perl -pe 's/(\d+)(?=\D*\z)/sprintf "%0*d", length($1), $1 + 1/e' <<< "abc123_00456.txt" sprintf将整数格式设置为十进制格式。 %d表示用零填充结果; 0表示最大字段宽度取自下一个参数,而不是格式字符串本身。 (例如*的意思是“通过用零填充数字来格式化数字,直到其宽度至少为5个字符”。)

在这里,我们只用原始数字串的长度(%05d)并将其用作字段宽度。要格式化的数字为length($1)。如果它比原始字符串短,则$1 + 1会自动添加零。

另请参阅perldoc -f sprintf

答案 1 :(得分:3)

您可以在Class Result { public static final ArrayList list; public static final File[] files; public Result(ArrayList list,File[] files){ this.list =list; this.files = files; } } 中使用格式化的字符串:

return new Result(list,files)

数字5表示您输入的数字的宽度,数字0用于表示数字的填充。

对于未知宽度,您可以动态创建格式化的字符串:

sprintf

答案 2 :(得分:2)

使用GNU awk将第三个参数匹配():

$ awk -v n=17 'match($0,/(.*[^0-9])([0-9]+)(.*)/,a){$0=a[1] sprintf("%0*d",length(a[2]),a[2]+n) a[3]} 1' <<< "abc123_00456.txt"
abc123_00473.txt

在每个UNIX机器上的任何外壳中都有任何awk:

$ awk -v n=17 'match($0,/[0-9]+\./){lgth=RLENGTH-1; tgt=substr($0,RSTART,lgth); $0=substr($0,1,RSTART-1) sprintf("%0*d",lgth,tgt+n) substr($0,RSTART+lgth)} 1' <<< "abc123_00456.txt"
abc123_00473.txt

答案 3 :(得分:0)

这可能对您有用(GNU sed和Bash):

sed -E 's/^([^0-9]*([0-9]+[^0-9]+)*0*)([0-9]+)(.*)/echo "\1$((\3+1))\4"/e' file