Используя встроенные правки Perl, как вставить строку после N-го вхождения строки? - PullRequest
0 голосов
/ 24 августа 2018

Поиск метода для вставки строки после N-го вхождения данной строки.

Следующее близко к тому, что я ищу, но основано на номере строки, в отличие от N-го вхождения данной строки.

perl -ni -e 'print; print "Put after fifth line\n" if $. == 5' inFile.txt

Ответы [ 4 ]

0 голосов
/ 24 августа 2018

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

perl -pe'$_.="foo\n" if /bar/ && ++$c == 5'

Оператор модуля (%) отлично подходит для обнаружения каждого N-го числа.

perl -pe'$_.="foo\n" if /bar/ && ++$c % 5 == 0'
0 голосов
/ 24 августа 2018

Если вы хотите повторять после каждого пятого вхождения строки, вы можете создать переменную в блоке BEGIN и отслеживать ее:

perl -n -e 'BEGIN{$c=0;} print; $c++ if /one/; if ($c==5){print "Put after fifth entry\n";$c=0}' inFile.txt
0 голосов
/ 24 августа 2018

[ Всегда приятно видеть, как кто-то проверял FAQ! Как изменить, удалить или вставить строку в файл или добавить в начало файла? . ]

Вот как бы я это сделал:

% perl -ni -e 'print; print "Inserted\n" if (/time/ && ++$c) == 3' input.txt

Переменная счетчика $c увеличивается на значение, возвращаемое оператором сопоставления. Это 0, если он не совпадает, и 1, если он совпадает (он используется в скалярном контексте, поэтому даже при /g он совпадает только один раз). После этого обновления до $c оно сравнивается с требуемым значением.

Вот input.txt :

 First time
 Second time
 Third time
 Fourth time

И результат:

 First time
 Second time
 Third time
 Inserted
 Fourth time

Также вы можете сделать это немного короче с -p, который автоматически ставит print в конце. В этом случае вы заканчиваете тем, что вставляете строку до следующей строки вместо после предыдущей строки (и это может быть проблемой, если у вас недостаточно строк, чтобы прийти перед чем-то ):

% perl -pi -e 'print "Inserted\n" if (/time/ && ++$c) == 4' input.txt

И вы можете рассмотреть возможность обновления до v5.28, если вы его еще не используете. Редактирование на месте становится немного безопаснее , если сначала записать во временный файл, а затем заменить исходный файл после успешного завершения программы.

0 голосов
/ 24 августа 2018

Следующее добавит строку xyz после второго вхождения строки abc:

perl -pi -e '/abc/&&++$n==2 and $_.="xyz\n"' inFile.txt
...