首页 > 解决方案 > 在 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 命令合并为一个来将这两个循环合并为一个吗?

标签: perl

解决方案


是的,您可以使用不同的正则表达式将 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

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


推荐阅读