Right now I'm using

echo "Hello World" >> file.txt

to append some text to a file but I also need to add text below a certain string let's say [option], is it possible with sed?


Input file

Some text
Some stuff

Output file

Some text
*inserted text*
Some stuff
  • 1
    You have to be more specific and give some sample text for people to help you with exact commands. – clement Mar 24 '14 at 14:51
  • please edit you Q and show the input and the output lines. Because you Q is unclear. You could also do echo "Hello World [option]" >> file.txt, but it doesn't make sense. – user55518 Mar 24 '14 at 14:56
  • I edited the question to provide more information for reference but the accepted answer was what I was trying to accomplish – Javier Villanueva Mar 24 '14 at 21:25
  • If you just want to edit a config file this is the best solution I found: unix.stackexchange.com/a/78076/20661 – rubo77 Jul 21 '16 at 8:20

Append line after match

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

Insert line before match

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

Additionally you can take backup and edit input file in-place using -i.bkp option to sed

  • 3
    on osx i get sed: 1: "/pattern/a some text here": command a expects \ followed by text – the_prole Jan 20 '19 at 21:11
  • @the_prole unix.stackexchange.com/questions/229873/… – Rahul Patil Jan 21 '19 at 14:45
  • 3
    for Mac OSX, I needed to add \ <<NEWLINE>> after the a option – Tom Howard Aug 2 '19 at 13:34
  • 1
    The above code will append/insert the line for every single match. If you want to append/insert the line for the first match only, you can prepend 0, to the commands: sed '0,/\[option\]/a Hello World' input or sed '0,/\[option\]/i Hello World' input – kimbaudi Aug 7 '19 at 2:50
  • @kimbaudi I'm not sure why, but in my case merely adding 0, inserts the line all over the file without any noticeable pattern (similar to stackoverflow.com/q/54382514) – aexl Aug 11 '20 at 9:37

Yes, it is possible with sed:

sed '/pattern/a some text here' filename

An example:

$ cat test
$ sed '/option/a insert text here' test
insert text here

With awk:

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

Keep in mind that some characters can not be included literally so one has to use escape sequences (they begin with a backslash) e.g. to print a literal backslash one has to write \\.

It's actually the same with sed but in addition each embedded newline in the text has to be preceded by a backslash:

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

For more details on escape sequences consult the manual.

  • An awk line does not actually change the text, only output. – Josef Klimuk Jun 17 '18 at 14:51
  • To change text in a file (replace inline), use awk -i inline ... – Tim Visee Jan 20 at 16:37

Not the answer you're looking for? Browse other questions tagged or ask your own question.