Вот один подход perl:
$ perl -ne 'if(/\[option\]/){print "*inserted text*\n"}; print' input
Some text
Random
*inserted text*
[option]
Some stuff
А вот еще один, более лаконичный:
$ perl -ne '/\[option\]/?print "*inserted text*\n$_":print' input
Some text
Random
*inserted text*
[option]
Some stuff
Это требует, чтобы вы прочитали весь файл в память:
$ perl -0777 -pe 's/\[option\]/*inserted text*\n$&/' input
Some text
Random
*inserted text*
[option]
Some stuff
Спасибо, @terdon и @Sundeep! Это та форма, которую я искал:
perl -lpe 'print "Hello World" if /^\[option\]$/' input
Обновление:
Я хочу вставить текстовую строку только в первый раз, когда она встречает «[option]», не всегда.
Я нашел решение:
perl -lpe 'print "Hello World" if /^\[option\]$/ && ++$i == 1' input
Вместо добавления текста я могу использовать команду:
perl -lpe '$_.= "\nHello World" if /^\[option\]$/ && ++$i == 1' input
&& - это и для if, а "++" или "--" означает увеличение или уменьшение на 1. Поскольку переменная i (может быть любой другой переменной )начинается с 0 по умолчанию и приращение производится в префиксной записи, это означает, что переменная сначала увеличивается, а затем производится первое сравнение. Такой синтаксис делает команду очень эластичной и более мощной, чем я думал. «&&» имеет более высокий приоритет, чем «и». Второе условие оценивается только в том случае, если выполняется первое. Таким образом, в этом случае значение переменной увеличивается и сравнивается только в случае совпадения.