Как вставить текст после определенной строки в файле?

69

Прямо сейчас я использую, echo "Hello World" >> file.txtчтобы добавить некоторый текст в файл, но мне также нужно добавить текст ниже определенной строки, скажем, «[опция]», это возможно с sed?

НАПРИМЕР:

Входной файл

Some text
Random
[option]
Some stuff

Выходной файл

Some text
Random
[option]
*inserted text*
Some stuff
Хавьер Вильянуэва
источник
1
Вы должны быть более конкретными и дать пример текста, чтобы люди могли помочь вам с точными командами.
Clement
пожалуйста, отредактируйте свой Q и покажите inputи outputлинии. Потому что вам Q неясно. Вы также можете сделать echo "Hello World [option]" >> file.txt, но это не имеет смысла.
Я отредактировал вопрос, чтобы предоставить больше информации для справки, но принятым ответом было то, чего я пытался добиться
Хавьер Вильянуэва
Если вы просто хотите отредактировать файл конфигурации, это лучшее решение, которое я нашел: unix.stackexchange.com/a/78076/20661
rubo77

Ответы:

104

Добавить строку после матча

  • sed '/\[option\]/a Hello World' input

Вставьте строку перед матчем

  • sed '/\[option\]/i Hello World' input

Кроме того, вы можете сделать резервную копию и редактировать входной файл на месте, используя -i.bkpопцию sed

Рахул Патил
источник
2
на OSX я получаюsed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole
@the_prole unix.stackexchange.com/questions/229873/…
Рахул Патил
для Mac OSX, мне нужно было добавить \ <<NEWLINE>>после aопции
Том Ховард
Приведенный выше код будет добавлять / вставлять строку для каждого совпадения. Если вы хотите добавить / вставить строку только для первого совпадения, вы можете добавить 0,команды: sed '0,/\[option\]/a Hello World' inputилиsed '0,/\[option\]/i Hello World' input
kimbaudi
33

Да, это возможно с sed:

sed '/pattern/a some text here' filename

Пример:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
devnull
источник
2
@javiervd Я не уверен, что ты имел в виду под первым ответом? Если вы имели в виду первое время, когда ответили, то вы не правы. Вы не соблюдали метки времени внимательно!
devnull
Есть ли способ добавить его после совпадения последней строки? Например: foo bar option bar option baz . Так картина станет foo bar option bar option addedstring baz ?
Ари
4

С awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Имейте в виду, что некоторые символы не могут быть включены буквально, поэтому необходимо использовать escape-последовательности (они начинаются с обратной косой черты), например, чтобы напечатать буквенную обратную косую черту, которую нужно написать \\.

Это на самом деле то же самое, sedно, кроме того, каждая новая строка в тексте должна начинаться с обратной косой черты:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Для более подробной информации о escape-последовательностях обратитесь к руководству.

don_crissti
источник
Строка awk на самом деле не меняет текст, только вывод.
Йозеф Климук