I am using sed command to insert an xml element into the existing xml file.
I have xml file as
You cannot have an unescaped newline in sed replacement text, that is $CONTENT
in your example. sed uses the newline just like the shell does, to terminate a command.
If you need a newline in the replacement text, you need to precede it with a backslash.
There is another way to add text using the r
option. For example:
Lets say your main file is;
$ cat file
<Students>
<student>
<name>john</>
<id>123</id>
</student>
<student>
<name>mike</name>
<id>234</id>
</student>
</Students>
You text you want to add is in another file (not variable):
$ cat add.txt
<student>
<name>NewName</name>
<id>NewID</id>
</student>
You can do (using gnu sed
):
$ sed '/<\/Students>/{
r add.txt
a \</Students>
d
}' file
<Students>
<student>
<name>john</>
<id>123</id>
</student>
<student>
<name>mike</name>
<id>234</id>
</student>
<student>
<name>NewName</name>
<id>NewID</id>
</student>
</Students>
However, having given this option, it is still a very bad idea to parse xml with regular expression. It makes the solution very fragile and easy to break. Consider this as a learning exercise only.
This might work for you (GNU sed & Bash):
CONTENT=' <student>\
<name>NewName</name>\
<id>NewID</id>\
</student>'
sed '/<\/Students>/i\'"$CONTENT" file
Alternatively, put the new students in a file and:
sed '/<\/Students>/e cat new_student_file' file
change this:
CONTENT="<student>
<name>NewName</name>
<id>NewID</id>
</student>"
to this:
CONTENT="<student>\n<name>NewName</name>\n<id>NewID</id>\n</student>"
and then:
C=$(echo $CONTENT | sed 's/\//\\\//g')
sed "/<\/Students>/ s/.*/${C}\n&/" file