Perl使用一行程序递增一个值并替换文本

Perl使用一行程序递增一个值并替换文本,perl,Perl,我在一些文件中有一行,其中只有年份不同——我需要增加年份并替换前面的文本,例如: tdef 12 linear 18Z31dec2012 1mo 应成为: tdef 12 linear 00Z01jan2013 1mo 我有一个perl单行程序,无法同时替换文本和增量。我已经尝试了很多组合,正确的格式让我难以理解。这会增加,但我当然会丢失文本: perl -pe 's/18Z31dec(\d+)/ 1 + $1 /ge' 我不知道如何在替换中插入任何文本并保留递增的年份: perl -pe

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

tdef 12 linear 18Z31dec2012 1mo
应成为:

tdef 12 linear 00Z01jan2013 1mo
我有一个perl单行程序,无法同时替换文本和增量。我已经尝试了很多组合,正确的格式让我难以理解。这会增加,但我当然会丢失文本:

perl -pe 's/18Z31dec(\d+)/ 1 + $1 /ge'
我不知道如何在替换中插入任何文本并保留递增的年份:

perl -pe "s/18Z31dec(\d+)/'00Z01jan($1 + 1)'/ge"
输出如下:

tdef 12 linear 00Z01jan( + 1) 1mo
使用
/e
时,替换的右侧是完整的Perl表达式。因此,您必须引用文字字符串,将它们与
连接起来,等等

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

perl -pe 's/18Z31dec(\d+)/"00Z01jan${\($1 + 1)}"/ge'
同样的结果

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

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

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

相同的结果。

18Z
更改为
00Z
意味着什么?它会一直以这种方式变化吗?我假设您希望搜索并替换任何日期,而不仅仅是2012年12月31日?您说只应增加年份,但似乎您实际将输入日期增加了1天(如果
18Z
表示时间为18:00,则可能仅增加6小时)。如果您提供了更大的输入行样本及其预期结果,这将非常有帮助。这是一个控制文件/模板时间开始指标,用于一年的月度气候变量。18Zulu是6小时的数据黑客之一(00、06、12、18)。开始时间始终为00Z01Jan,因此仅以年为增量。我希望在不给每个人带来这些细节负担的情况下提出我的问题——一行可以变得相当深奥。谢谢你的澄清。我不清楚您是否只想更新与
18Z31dec
匹配的行。我错误地认为您实际上是在为文件中的每个日期添加一致的间隔。我很高兴你得到了你需要的答案。请注意,“一行”并不意味着“一句话”。您可以计算并存储一个中间结果,而不是将整个逻辑嵌入一个替换中。
18Z
更改为
00Z
意味着什么?它会一直以这种方式变化吗?我假设您希望搜索并替换任何日期,而不仅仅是2012年12月31日?您说只应增加年份,但似乎您实际将输入日期增加了1天(如果
18Z
表示时间为18:00,则可能仅增加6小时)。如果您提供了更大的输入行样本及其预期结果,这将非常有帮助。这是一个控制文件/模板时间开始指标,用于一年的月度气候变量。18Zulu是6小时的数据黑客之一(00、06、12、18)。开始时间始终为00Z01Jan,因此仅以年为增量。我希望在不给每个人带来这些细节负担的情况下提出我的问题——一行可以变得相当深奥。谢谢你的澄清。我不清楚您是否只想更新与
18Z31dec
匹配的行。我错误地认为您实际上是在为文件中的每个日期添加一致的间隔。我很高兴你得到了你需要的答案。请注意,“一行”并不意味着“一句话”。您可以计算并存储一个中间结果,而不是将整个逻辑嵌入一个替换中。谢谢Mark!我通常使用sed,最好了解perl的右侧差异+1用于标量解引用。谢谢Mark!我通常使用sed,最好了解perl的右侧差异+1表示标量解引用。