我想增加价值。例如
- 杰瑞1
- 杰瑞2
- 杰瑞3
- 杰瑞4
我想改变它。
- 杰瑞2
- 杰瑞3
- 杰瑞4
- 杰瑞5
我该如何改变?
不要试图对所有事情都滥用正则表达式。
按照设计,正则表达式不支持 count。原因很简单:如果你想拥有它,你至少需要一种 2 型语言,而处理比 3 型(“常规”)语言要复杂得多。
详见维基百科:https ://en.wikipedia.org/wiki/Chomsky_hierarchy
因此,根据定义,一旦您完全支持计数,它可能不再是常规语言。
有一些扩展,例如 perl 扩展的正则表达式,确实可以解决这个特定问题。但本质上,它们不再是正则表达式,而是调用外部函数来完成工作。
以下perl 扩展正则表达式应该可以满足您的要求:
s/(-?\d+)/$1 + 1/eg
但本质上,只有匹配部分是正则表达式,替换是Perl,所以图灵完备。该e
标志表示正确的部分应该由 Perl 评估,而不是作为正则表达式替换字符串。
您当然可以在几乎任何其他正则表达式引擎中使用此技巧。匹配,然后计算增量,然后用新值替换匹配。
完整的 perl 过滤器演示:
> echo 'Test 123 test 0 Banana9 -17 3 route66' | perl -pe 's/(-?\d+)/$1+1/eg'
Test 124 test 1 Banana10 -16 4 route67
该p
标志使 perl 读取标准输入并将程序应用于每一行,然后输出结果。这就是实际脚本仅包含替换的原因。这就是 Perl 在 unix 脚本中如此受欢迎的原因。您甚至可以将此过滤器批量应用于一整套文件(请参阅-i
就地修改和perlrun
手册页)。因此,为了修改一整套文件(备份将使用 后缀.bak
):
perl -p -i .bak -e 's/(-?\d+)/$1+1/eg' <filenames>