Как найти шаблон из list1, а затем заменить предыдущую строку из list2 - PullRequest
0 голосов
/ 23 декабря 2010

У меня есть один файл и 2 списка

[RECORD]
Name: test1
Loc: x
Mob: y
[RECORD]
Name: test2
Loc: xx
Mob: yy

и List_old:

x
xx

List_new

0001
1110

И нужно искать, если найдено Loc:x (x из list_old), затем замените Mob: y на Mob: 0001 (0001 из new_list)

Выходной результат:

[RECORD]
Name: test1
Loc: x
Mob: 0001
[RECORD]
Name: test2
Loc: xx
Mob: 1110

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Вот быстрый и грязный скрипт, который вы можете использовать:

#!/usr/bin/perl

die "Use: replace.pl <file> <list1> <list2>" unless $#ARGV==2;

open LIST1, $ARGV[1] or die $ARGV[1].": $!";
open LIST2, $ARGV[2] or die $ARGV[2].": $!";
open FILE,  $ARGV[0] or die $ARGV[0].": $!";

while (<LIST1>) {
  chomp;
  $key=$_;
  $value=<LIST2>;
  chomp $value;
  $hash->{$key}=$value;
}

while (<FILE>) {
  if (/^Loc: (.*)/) {
    $repl=$hash->{$1};
  }
  if (/^Mob: (.*)/ and defined $repl) {
    s/Mob: (.*)/Mob: $repl/;
    $repl=undef;
  }

  print;
}

close LIST1;
close FILE;
close LIST1;

Надеюсь, я хорошо понял, чего вы пытаетесь достичь.Этот сценарий выводит результат в стандартный вывод и не изменяет строки, для которых нет соответствующих шаблонов в списках.Кроме того, предполагается, что списки имеют одинаковый размер, и в целом делает очень мало, чтобы избежать ошибок.

0 голосов
/ 23 декабря 2010

Все ли старые записи типа Mob: y?Если это так, то вам не обязательно соответствовать вашей замене Loc: x, поскольку запись моба уже уникальна.

Если этого достаточно, вы можете использовать:

perl -p -i-bkup -e 's/Mob: y/Mob: 0001/g' FILE
...