Perl正则表达式替换从原位匹配增加数值

时间:2018-07-04 10:23:09

标签: perl

在一个正则表达式操作中,是否有办法将正则表达式替换为Perl中增加的+1或+2值?例如。以下将L001更改为L002或L003或L004的内容:

$ echo XYZ123-123-123x_S6_L001_R1_001.fastq.gz | perl -lne '$_ =~ /\_L(\d{3})/; $new=sprintf("%03d",$1+1); s/\_L\d{3}/\_L$new/;print'

XYZ123-123-123x_S6_L002_R1_001.fastq.gz

但是在正则表达式操作中就地执行此操作,类似于下面的操作(无效):

echo XYZ123-123-123x_S6_L001_R1_001.fastq.gz | perl -lne 's/\_L(\d{3})/\_$1+1/;print'

1 个答案:

答案 0 :(得分:3)

您需要在正则表达式上使用/e来指定“评估”。

但是,如果您这样做,则是在进行评估,因此您不能再使用裸字了。 \_1+1无效。您可以做$1+1,但是只会给您2,而不能给002

因此,您还需要sprintf来零填充。

在使用时,您可以使用-p代替-n而不是结尾打印。

并获得:

echo XYZ123-123-123x_S6_L001_R1_001.fastq.gz | perl -pe 's/_L(\d{3})/sprintf("_L%03d",$1+1)/e'

哪个给你:

XYZ123-123-123x_S6_L002_R1_001.fastq.gz