Regex CLI:在保留填充零的同时增加字符串中的数字
我当前使用此perl命令增加字符串中的最后一个数字:Regex CLI:在保留填充零的同时增加字符串中的数字,regex,string,perl,sed,command-line,Regex,String,Perl,Sed,Command Line,我当前使用此perl命令增加字符串中的最后一个数字: perl -pe 's/(\d+)(?!.*\d+)/$1+1/e' <<< "abc123_00456.txt" 我还希望能够以任意数字递增(而不仅仅是1),因此没有++ 我不想使用shell的内置程序来实现这一点。您可以将格式化字符串与sprintf一起使用: perl -pe 's/(\d+)(?!.*\d)/sprintf("%05d",$1+1)/e' <<< "abc123_00456.txt
perl -pe 's/(\d+)(?!.*\d+)/$1+1/e' <<< "abc123_00456.txt"
我还希望能够以任意数字递增(而不仅仅是1),因此没有++
我不想使用shell的内置程序来实现这一点。您可以将格式化字符串与
sprintf
一起使用:
perl -pe 's/(\d+)(?!.*\d)/sprintf("%05d",$1+1)/e' <<< "abc123_00456.txt"
perl-pe's/(\d+(..*\d)/sprintf(“%05d”,$1+1)/e'您可以将格式化字符串与sprintf
一起使用:
perl -pe 's/(\d+)(?!.*\d)/sprintf("%05d",$1+1)/e' <<< "abc123_00456.txt"
请尝试以下方法:
perl -pe 's/(\d+)(?=\D*\z)/my $n = $1; ++$n/e' <<< "abc123_00456.txt"
这使您的增量超过1(或执行其他算术运算)
sprintf
%d
将整数格式化为十进制格式0
表示用零填充结果*
表示最大字段宽度取自下一个参数,而不是格式字符串本身。(例如,%05d
的意思是“用零填充一个数字,直到它至少有5个字符宽。”
在这里,我们只需获取原始数字字符串的长度(length($1)
),并将其用作字段宽度。要格式化的数字是$1+1
。如果它比原始字符串短,sprintf
会自动添加零
另请参见。尝试以下操作:
perl -pe 's/(\d+)(?=\D*\z)/my $n = $1; ++$n/e' <<< "abc123_00456.txt"
这使您的增量超过1(或执行其他算术运算)
sprintf
%d
将整数格式化为十进制格式0
表示用零填充结果*
表示最大字段宽度取自下一个参数,而不是格式字符串本身。(例如,%05d
的意思是“用零填充一个数字,直到它至少有5个字符宽。”
在这里,我们只需获取原始数字字符串的长度(length($1)
),并将其用作字段宽度。要格式化的数字是$1+1
。如果它比原始字符串短,sprintf
会自动添加零
另请参见。带GNU awk的第三个要匹配的参数()
$awk-vn=17'匹配($0,/(.[^0-9])([0-9]+)(.*)/,a){$0=a[1]sprintf(%0*d),长度(a[2]),a[2]+n)a[3]}1',第三个参数匹配()
$awk-vn=17'匹配($0,/(.[^0-9])([0-9]+)(.*)/,a{$0=a[1]sprintf(%0*d),长度(a[2]),a[2]+n)a[3]}1'这可能适合您(GNU-sed&Bash):
这可能适合您(GNU-sed&Bash):
零的数目不是5所特有的。@HappyFace:5是整数的宽度,而不是零的数目。数字的宽度不是常数。@HappyFace:Ok,你总是递增1吗?不,这也不是常数,我通过“${1:-1}”设置它。零的数目不是特定于5的。@HappyFace:5是整数的宽度,而不是零的数目。数字的宽度不是常数。@HappyFace:好的,你总是递增1吗?不,那也不是常数,我通过“${1:-1}”设置它。这很有效,但我希望能够概括递增的数字(不仅仅是1)。这很有效,但我希望能够概括递增的数字(不仅仅是1)。提示:(?!.\d+)
可以简化为(?!.\d)
,最好使用/s
,因为没有理由检查换行。提示:(?!.\d+
可以简化为(?!.\d+)
,最好使用/s
,因为没有理由检查换行符。如果数字在字符串的开头,则不起作用,例如00456.txt
。对,但数字不在字符串的开头(如果可以的话,这是一个简单的调整)。如果数字是指数或浮点格式,它也不起作用,但OP也没有将其作为示例输入显示给我们。如果数字位于字符串开头,则不起作用,例如00456.txt
。对,但数字不在字符串开头(当然,如果可能的话,这是一个简单的调整)。如果数字是指数或浮点格式,它也不起作用,但OP也没有将其作为示例输入显示给我们。
perl -pe 's/(\d+)(?=\D*\z)/sprintf "%0*d", length($1), $1 + 1/e' <<< "abc123_00456.txt"
$ 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
$ 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
sed -E 's/^([^0-9]*([0-9]+[^0-9]+)*0*)([0-9]+)(.*)/echo "\1$((\3+1))\4"/e' file