在Perl中使用两个搜索和替换regex命令

时间:2018-10-19 14:55:14

标签: perl

在文件中,我必须替换

.L1 to L_xx_1 
.L2 to L_xx_2 
.L3 to L_xx_3 
...

.LC1 to LC_xx_1
.LC2 to Lc_xx_2
.LC3 to LC_xx_3
...

对于这两个搜索和替换,我有两个不同的Perl脚本,其中包含以下两个不同的循环:

for ($i=0; $currentLine=<file>; $i++) {
    $currentLine =~ s/.L(\d+)/L_$ARGV[1]_$1/gi;
    print $currentLine;
} 

for ($i=0; $currentLine=<file>; $i++) {
     $currentLine =~ s/.LC(\d+)/LC_$ARGV[1]_$1/gi;
     print $currentLine; 
}

分别。

我可以通过将两个S命令合并为一个将这两个循环合并为一个。

2 个答案:

答案 0 :(得分:2)

是的,您可以将2个替换项与一个具有不同正则表达式的合并。您可以捕获“ L”,然后是可选的“ C”。

use warnings;
use strict;

my $str = 'xx';
while (my $currentLine = <DATA>) {
    $currentLine =~ s/\.(LC?)(\d+)/$1_${str}_$2/gi;
    print $currentLine;
}

__DATA__
.L1
.L2
.L3
.LC1
.LC2
.LC3

此打印:

L_xx_1
L_xx_2
L_xx_3
LC_xx_1
LC_xx_2
LC_xx_3

请注意,我转义了第一个字符(句点)。这只会匹配一个字面量。

答案 1 :(得分:1)

将正则表达式修改为
$currentLine =~ s/\.L(C?)(\d+)/L$1_$ARGV[1]_$2/gi;