Perl中的评估搜索和替换

时间:2014-06-25 15:14:20

标签: regex perl replace

我有一个格式如下的文件:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

9558    9629    gene
            locus_tag   CeraR_t011
            gene    trnR-UCU

11296   9773    CDS
            locus_tag   CeraR_p012


            gene    atpA
            product ATP synthase CF1 alpha subunit

            transl_except   (pos:complement(10268..10270), aa:Q)
            transl_except   (pos:complement(11192..11194), aa:Q)
            transl_except   (pos:complement(13267..13269), aa:M)
11296   9773    gene
            locus_tag   CeraR_p012
            gene    atpA

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我需要在每个实例中的pos:complement之后的两个值中添加809。我一直在尝试使用搜索和替换修饰符:

$line =~ s!complement((\d+)..(\d+)!complement(($1+809)..($2+809)!eg

然而,(补语之后总是被解释为评价的一部分,而不仅仅是一个字符。我已经尝试了反斜杠,撇号和引号的每一个组合,使它只是一个字符,但似乎没有任何效果。

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:1)

由于评估了替换字符串,因此必须使用带引号的字符串和连接:

$line =~ s/complement\(\K(\d+)..(\d+)/($1+809) . '..' . ($2+809)/eg;

注意:由于\K会从匹配结果中删除左侧的所有内容,因此您无需在替换字符串中重写匹配的所有开头。