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


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


для 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
$

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-последовательностях обратитесь к руководству.


Строка awk на самом деле не меняет текст, только вывод.
Йозеф Климук
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.