Как изменить шаблон, например, XX1 / XXSomething / XX1 / Something to XXSomething / XX1 / Something in perl - PullRequest
1 голос
/ 15 мая 2019

У меня есть файл, в котором некоторые строки имеют некоторые шаблоны, такие как

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 
}

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

Если вы ищете специально для 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
2 голосов
/ 15 мая 2019

Если все в порядке, слепо удалите первую часть:

while (<>) {
   s{ \K[^\s/]+/}{}g;
   print;
}

Как однострочник:

perl -pe's{ \K[^\s/]+/}{}g'

Если вы хотите убедиться, что она соответствует шаблонуВы указали:

while (<>) {
   s{(?<!\S)(XX\d)/(?=XX[^\s/]+/\1/\S)}{}ag;
   print;
}

В качестве однострочного:

perl -pe's{(?<!\S)(XX\d)/(?=XX[^\s/]+/\1/\S)}{}ag'

Ключ \1, что означает «соответствует тому, что было захвачено при первом захвате».

0 голосов
/ 15 мая 2019

Исходя из того, что вы объяснили в описании вашей проблемы XX[0..9], следующая команда perl должна помочь:

Ввод:

$ cat input
M1/XX2/XX1 XX2/XX1/XX2/WCLKB XX2/XX1/XX2/P001  
M1/XX4/XX5 XX4/XX5/XX4/WCLKB XX4/XX5/XX4/P001

Команда:

perl -pe 's@\bXX(\d)/XX(\d)/XX\1@XX$2/XX$1@g' input

Выход:

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