我当前使用此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的内置函数来完成此操作。
答案 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