129

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?

EG:

Input file

Some text
Random
[option]
Some stuff

Output file

Some text
Random
[option]
*inserted text*
Some stuff
4
  • 2
    You have to be more specific and give some sample text for people to help you with exact commands.
    – clement
    Mar 24, 2014 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, 2014 at 14:56
  • I edited the question to provide more information for reference but the accepted answer was what I was trying to accomplish Mar 24, 2014 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, 2016 at 8:20

3 Answers 3

165

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

9
  • 6
    on osx i get sed: 1: "/pattern/a some text here": command a expects \ followed by text
    – the_prole
    Jan 20, 2019 at 21:11
  • 3
    for Mac OSX, I needed to add \ <<NEWLINE>> after the a option
    – Tom Howard
    Aug 2, 2019 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, 2019 at 2:50
  • 1
    Works for me and if you want insert space it may like sed '/\[option\]/a \ \ Hello World' input
    – hukeping
    Oct 9, 2020 at 8:40
  • 1
    If the appended string is a multiline text u can save it to a file (e.g.: snippet.txt) and inject this file after the pattern using: sed -i '/pattern/ r snippet.txt' filename
    – Savrige
    Oct 24, 2021 at 14:40
53

Yes, it is possible with sed:

sed '/pattern/a some text here' filename

An example:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
0
9

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.

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

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