regex - 如何在 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
}
解决方案
如果您要专门寻找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