37

I'm trying to insert text to the third line in a file using sed, and the syntax I've found on other forums is:

sed -i '' "3i\ text to insert" file

When I use this however, I get an error:

sed: 1: "3i\ text to insert": extra characters after \ at the end of i command

I can't seem to figure out what is causing the problem. I'm using OSX, which is why I have an empty ' ' as my extension.

Thanks!

anubhava
  • 761,203
  • 64
  • 569
  • 643
gdavtor
  • 530
  • 1
  • 5
  • 8

8 Answers8

59

You should put a newline directly after the \:

sed '3i\
text to insert' file

This is actually the behaviour defined by the POSIX specification. The fact that GNU sed allows you to specify the text to be inserted on the same line is an extension.


If for some reason you need to use double quotes around the sed command, then you must escape the backslash at the end of the first line:

sed "3i\\
text to insert" file

This is because a double-quoted string is processed first by the shell, and \ followed by a newline is removed:

$ echo "abc\
def"
abcdef
Tom Fenech
  • 72,334
  • 12
  • 107
  • 141
21

On OSX you can use:

sed -i.bak '3i\
text to insert
' file
anubhava
  • 761,203
  • 64
  • 569
  • 643
11

A one-liner for OSX employing ANSI-C quoting:

sed -i '' '3i\'$'\n''text to insert' file

Adapted from https://stackoverflow.com/a/24299845/901597

Joe Bowbeer
  • 3,574
  • 3
  • 36
  • 47
9

Here's how to do it in one line syntax

sed -i '' -e "2s/^//p; 2s/^.*/text to insert/" file
  • duplicate second line: 2s/^//p;

  • replace new line with your text: 2s/^.*/text to insert/

VladimirAus
  • 181
  • 1
  • 4
  • I believe this approach will work to add a line between any two lines n and n+1. However, attempting this against the very first line you encounter problems described in [another post](https://unix.stackexchange.com/questions/99350/how-to-insert-text-before-the-first-line-of-a-file) – Jason Hemann May 02 '21 at 14:19
4

This works for me

sed -i '' '3i\
text to insert' file 
ali
  • 350
  • 2
  • 15
1

I've found that I have to insert a \ at the end of the line to be inserted, otherwise it concatenates it at the beginning of the original line. So, if I want to insert a new third line,...

sed -i '' '3i\<br>
New line to be inserted.\<br>
' file
Simon.S.A.
  • 6,240
  • 7
  • 22
  • 41
0

If you want to modify a file of specific file type(.sh in my case) use this command.

sed -i '.sh' '3i\
mymodified text to insert' temp.sh

Make sure you have line break after slash ("\")

Anil
  • 595
  • 1
  • 5
  • 15
0

To insert text to the first line and put the rest on a new line using sed on macOS this worked for me

sed -i '' '1 i \
Insert
' ~/Downloads/File-path.txt
Ax_
  • 803
  • 8
  • 11