Perl 一个衬垫来增加一个值并替换文本

chu*_*ley 0 perl

我在某些文件中有一行,其中只有年份不同——我需要增加年份并替换前面的文本,例如:

tdef 12 linear 18Z31dec2012 1mo
Run Code Online (Sandbox Code Playgroud)

应该变成:

tdef 12 linear 00Z01jan2013 1mo
Run Code Online (Sandbox Code Playgroud)

我有一个 perl one liner,我无法同时替换文本和增量。我已经尝试了很多组合,正确的格式让我望而却步。这会增加,但我当然会丢失文本:

perl -pe 's/18Z31dec(\d+)/ 1 + $1 /ge'
Run Code Online (Sandbox Code Playgroud)

我不知道如何在替换中插入任何文本并保留递增的年份:

perl -pe "s/18Z31dec(\d+)/'00Z01jan($1 + 1)'/ge"
Run Code Online (Sandbox Code Playgroud)

输出这个:

tdef 12 linear 00Z01jan( + 1) 1mo
Run Code Online (Sandbox Code Playgroud)

Mar*_*eed 5

perl -pe 's/18Z31dec(\d+)/"00Z01jan" . ($1 + 1)/ge'
Run Code Online (Sandbox Code Playgroud)

当您使用 时/e,替换的右侧是完整的 Perl 表达式。所以你必须引用文字字符串,将它们连接起来.,等等。

您可以使用基于标量解引用的有点不吸引人的任意表达式插值语法,而不是串联:

perl -pe 's/18Z31dec(\d+)/"00Z01jan${\($1 + 1)}"/ge'
Run Code Online (Sandbox Code Playgroud)

结果一样。