【问题标题】:Regex for Replacing String with Incrementing Number用递增数字替换字符串的正则表达式
【发布时间】:2015-11-03 21:33:22
【问题描述】:

曾几何时,我使用 UltraEdit 来制作这个

text 1
text 2
text 3
text 4
...

从那

text REPLACE
text REPLACE
text REPLACE
text REPLACE
...

就像用 \i 替换 REPLACE 一样简单

现在,我该如何使用例如。 sed?

如果您提供解决方案,您能否添加使用前导零填充结果的说明?

谢谢

【问题讨论】:

    标签: regex replace awk sed increment


    【解决方案1】:

    您可以为此使用 awk 而不是 sed:

    awk '{ sub(/REPLACE/, ++i) } 1' file
    text 1
    text 2
    text 3
    text 4
    ...
    

    Code Demo

    【讨论】:

    • 嗯,对我不起作用。你能解释一下这应该如何完成它的工作吗?
    • 但是如果我的数据更改为somethingelse REPLACE,它就不再起作用了。能否请您提供一个替换 REPLACE 且不依赖其他文件内容的脚本?
    • 嗯,它仍然依赖于空格。但我可以解决这个问题。而且我不知道这是如何工作的,也无法从中学习。 :( 但无论如何感谢您的帮助...这是否意味着if column 2 contains REPLACE then set column 2 to i++?1 有什么用处?
    • 好的,请再次检查更新的答案,以消除等式中的空间。 awk 中的1 被称为打印记录的默认操作。
    • 对不起,我只将您问题的第一部分视为您想要的输出。所以可以使用前导零awk '{ sub(/REPLACE/, sprintf("%03d",++i)) } 1' file。
    【解决方案2】:

    这是你想要的吗?

    $ awk '{$NF=sprintf("%05d",++i)} 1' file
    text 00001
    text 00002
    text 00003
    text 00004
    

    如果没有,请编辑您的问题以显示一些更具代表性的示例输入和预期输出(如果 ...s 在您的输入和输出中不存在,则删除它们,因为它们会使您的示例不可测试)。

    【讨论】:

    • 谢谢大家,我现在使用两种解决方案的组合:awk '{ sub(/REPLACE/, sprintf("%02d",++i)) } 1'。我想接受两个答案,但你只能接受一个。对不起。
    【解决方案3】:
    perl -i -pe 's/REPLACE/++$i/ge' file
    

    对于最小宽度的零填充(即如果有 10 个替换,则使用字段宽度 2):

    perl -i -pe '
        BEGIN {
            $patt = "REPLACE"; 
            chomp( $n = qx(grep -co "$patt" file) ); 
            $n = int( log($n)/log(10) ) + 1;
        } 
        s/$patt/ sprintf("%0*d", $n, ++$i) /ge
    ' file
    

    【讨论】:

      猜你喜欢
      • 2018-07-13
      • 2011-10-28
      • 2012-04-26
      • 2021-11-29
      • 2017-02-04
      相关资源
      最近更新 更多