Как изменить строку, расположенную через одну строку после определенной строки, с помощью Perl?

#perl

Вопрос:

У меня есть файл, содержащий следующие строки:

 ...
# Check the date
date
...
 

Я хочу прокомментировать date команду. Но это происходит несколько раз в файле , и я хочу прокомментировать date то, что находится через одну строку после # Check the date , в противном случае я бы просто использовал:

 perl -i -pe 's:(.*date.*):#$1:' file
 

Как я могу улучшить свою логику и комментировать только date сразу после # Check the date комментария?

Ответ №1:

Помните, была ли предыдущая строка комментарием в переменной:

 perl -pe 's/^(date)$/#$1/ if $prev; $prev = /^# Check the date$/;'
 

Комментарии:

1. Нит: Я думаю , что вы изначально намеревались назначить «предыдущую» строку $prev , но передумали. Таким образом, $fix получается лучшее имя переменной.

Ответ №2:

Честно говоря, я бы не стал использовать perl для этого редактирование на месте, я бы обратился к старому доброму ed :

 printf '%sn' '/^# Check the date/ 1s/^/# /' w | ed -s file
 

добавит a # в начало строки, следующей за первой строкой, которая соответствует регулярному выражению ^# Check the date , и сохранит изменение.

 printf '%sn' '/^# Check the date/ 1g/^date$/s/^/# /' w | ed -s file
 

будет делать то же самое, только если следующая строка date .