Perl - вставка строк после того, как совпадение найдено в файле - PullRequest
0 голосов
/ 06 августа 2010

У меня есть файл со следующим синтаксисом в some_1.xyz

module some_1 {
INPUT PINS
OUTPUT PINS
}

и я хочу вставить APPLY DELAYS xx и APPLY LOADS ld после линейного модуля some_1 {

Следующий код прекрасно работает только для одного файла, то есть, если я заменю some_1.xyz на * .xyz, скрипт не будет работать. Я попытался ввести sleep (xx), но код не работает для нескольких файлов, и я не мог понять, почему он не работает. Любые указатели приветствуются. Спасибо

@modulename_array = `grep "module " some_1.xyz | cut -f 2 -d ' '`;
@line = `grep "module " some_1.xyz`;

chomp(@line);
chomp(@kfarray);

$i = 0;
foreach (@modulename_array) {
  print "Applying delay and load to $_.xyz $line[$i] \n";

  `perl -ni -le 'print; print "\tAPPLY DELAY xx \n \tAPPLY LOADS  ld\n" if/$line[$i]/' $_.xyz`;
  $i++;
  #sleep(3);

}

Ответы [ 4 ]

4 голосов
/ 07 февраля 2012

Что-то намного проще, всего в одной строке с использованием SED (в случае, если этот вопрос только для UNIX и когда совпадение является фиксированным значением, а не регулярным выражением):

sed -i -e "s/<match pattern>/<match pattern>\n<new line here>/g" file.txt

(вариантыпоменялся местами по сравнению с первоначальным ответом, потому что первый комментарий.)

Обратите внимание на \ n, чтобы добавить новую строку.Привет

3 голосов
/ 07 августа 2010

А что не так с простым решением?:

$data=`cat /the/input/file`;
$data=~s/some_1 {\n/some_1 {\nAPPLY DELAYS xx\nAPPLY LOADS ld\n/gm;
print $data;
0 голосов
/ 28 мая 2019
$text='bla bla mytext bla bla';
$find='.*mytext.*';
$repl='replacement';

$text=~ s/($find)/$1$repl/g;

$ 1 - это, в основном, ваше совпадение, и вы можете использовать его при замене, до или после строки $ repl.)))

ЛЕГКО

0 голосов
/ 06 августа 2010

Я понятия не имею, почему ваш код не работает, но у меня проблемы с отслеживанием использования вами Perl внутри обратных ссылок внутри Perl. Это не проверено, но должно работать. Я предлагаю вам также «использовать строгий»; и «используйте предупреждения;».

my @files = ("some_1.xyz", "some_2.xyz", ... );
for my $file in ( @files )
{
    my $outfile = $file + ".tmp";
    open( my $ins, "<", $file ) or die("can't open " . $file . " for reading: " . $!);
    open( my $outs, ">", $outfile ) 
        or die("can't open " . $outfile . " for writing: " . $!);
    while ( my $line = <$ins> )
    {
        print { $outs } $line;
        if ( $line =~ m/^module\s+/ )
        {
             print { $outs } "\tAPPLY DELAY xx\n\tAPPLY LOADS ld\n";
        }
    }
    rename( $outfile, $file );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...