首页 > 解决方案 > 如何在 perl 中将 XX1/XXSomething/XX1/Something 之类的模式更改为 XXSomething/XX1/Something

问题描述

我有一个文件,其中一些行有一些模式,比如

M1/XX2/XX1 XX2/XX1/XX2/WCLKB XX2/XX1/XX2/P001  
M1/XX4/XX5 XX4/XX5/XX4/WCLKB XX4/XX5/XX4/P001

在某些模式中,XX2 是重复的。我需要将上面的行更改为

M1/XX2/XX1 XX1/XX2/WCLKB XX1/XX2/P001
M1/XX4/XX5 XX5/XX4/WCLKB XX5/XX4/P001

这些 XX 可以变化 XX[0..9] 代码是在 Perl 中的。

我尝试使用一些正则表达式但很困惑。

 open(FILE,$FilePath);
 @linesInFile = <FILE>;
 close(FILE);
 foreach $item(@linesInFile){
    if(grep(/^XX?\/XX.\/XX)
  #I dont know how to complete this 
}

标签: regexperlpattern-matchingfile-handlingregex-negation

解决方案


如果您要专门寻找XXn/XXm/XXn/n两次都是相同的数字),您可以使用反向引用:

s{(XX[0-9]+/)(XX[0-9]+/\1)}{$2}g

这里\1引用并匹配与第一个捕获组相同的字符串,(XX[0-9]+/).

现场演示

#!/usr/bin/perl
use strict;
use warnings;

while (my $line = readline DATA) {
    $line =~ s{(XX[0-9]+/)(XX[0-9]+/\1)}{$2}g;
    print $line;
}

__DATA__
M1/XX2/XX1 XX2/XX1/XX2/WCLKB XX2/XX1/XX2/P001
M1/XX4/XX5 XX4/XX5/XX4/WCLKB XX4/XX5/XX4/P001

输出:

M1/XX2/XX1 XX1/XX2/WCLKB XX1/XX2/P001
M1/XX4/XX5 XX5/XX4/WCLKB XX5/XX4/P001

推荐阅读