Попробуйте эту однострочную строку, которая делает именно то, что вы просили: отредактируйте строку на n строк ниже некоторого конкретного соответствия в Perl . Но также рассмотрим NOTES ниже.
cat file | perl -lpe '
$seen = 1 if m{\[MARATHON\]}xms;
$num_lines++ if $seen;
s{ \A ( PROTOCOL \s+ = \s+ ) http }{${1}https}xms if $num_lines == 4;
'
NOTES:
Приведенный выше код отвечает на вопрос, но это плохой код. Почему? Обычно плохая идея разбирать известный широко используемый формат, полагаясь только на на ожидаемые шаблоны и ожидаемое количество строк. Здесь формат выглядит как .ini
, поэтому рассмотрите возможность поиска модулей / библиотек, используемых для анализа / чтения / записи config ini
файлов. Например:
Если вы не хотите использовать модули, подобные приведенным выше, по крайней мере, рассмотрите возможные будущие изменения ввода и используйте меньше предположений в своем коде. В этом случае предположение о n -ой строке из заголовка раздела кажется наименьшим надежным для изменения. Синтаксические анализаторы ini
в исходном коде, которые пишут этот файл, могут не заботиться о порядке строк. Заголовки разделов более надежны. Возможно, прочитайте весь файл (slurp
) и измените на https
, используя не жадное многострочное регулярное выражение от [MARATHON]
до PROTOCOL = http
. Не указывайте точное количество строк, просто убедитесь, что изменяемая строка находится в том же разделе. Но это все еще изобретает колесо - избегайте, если можете.
СМОТРИТЕ ТАКЖЕ: