Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex CLI:在保留填充零的同时增加字符串中的数字_Regex_String_Perl_Sed_Command Line - Fatal编程技术网

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

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命令增加字符串中的最后一个数字:

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