17

I want to add this

#this 
##is my 
text

before the line

the specific line 

I tried this

sed -i '/the specific line/i \
#this 
##is my 
text
' text.txt

but it only adds in 'text'.

I also tried various combinations with \ and " " but nothing worked.

3 Answers 3

18

You're missing the trailing backslash at the end of some lines (and you have an eccessive newline at the end of the last line you want to insert):

sed -i '/the specific line/i \
#this\
##is my\
text' file
% cat file
foo
the specific line
bar

% sed -i '/the specific line/i \
#this\
##is my\
text' file

% cat file
foo
#this 
##is my 
text
the specific line
bar
0
6

With newlines:

% sed -i '/the specific line/i #this\n##is my\ntext' foo

% cat foo
#this
##is my
text
the specific line
0
2

When the replacement string has newlines and spaces, you can use something else. We will try to insert the output of ls -l in the middle of some template file.

awk 'NR==FNR {a[NR]=$0;next}
    /Insert index here/ {for (i=1; i <= length(a); i++) { print a[i] }}
    {print}'
    <(ls -l) text.txt

When you want something inserted after a line, you can move the command {print} or switch to :

sed '/Insert command output after this line/r'<(ls -l) text.txt

You can also use sed for inserting before a line with

sed 's/Insert command output after this line/ls -l; echo "&"/e' text.txt

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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