分享
三行代码  ›  专栏  ›  技术社区  ›  HappyFace

cli:在保持填充零的同时在字符串中增加一个数字

  •  1
  • HappyFace  · 技术社区  · 3 月前

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

    IT输出 abc123_457.txt abc123_00457.txt

    我也想要类似的东西 99 100 00

    我想要的更多例子:

    09 -> 10
    004 -> 005
    

    ++

    3 回复  |  直到 3 月前
        1
  •  4
  •   melpomene    3 月前

    试试这个:

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

    ++ preserves the number of digits 递增字符串时。

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

    sprintf %d 0 * %05d 表示“用零填充数字,直到至少5个字符宽。”)

    length($1) $1 + 1

    perldoc -f sprintf

        2
  •  2
  •   Casimir et Hippolyte    3 月前

    您可以将格式化字符串用于 sprintf

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

    5给出了数字的宽度,0是用来填充数字的字符。

    perl -pe 's/(\d+)(?!.*\d)/sprintf("%0".length($1)."d",$1+1)/e' <<< "abc123_00456.txt"
    
        3
  •  1
  •   Ed Morton    3 月前

    对于第3个arg to match()的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
    

    $ 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