Search code examples
xmlbashshellsed

Adding XML element in XML file using sed command in shell script


I am using sed command to insert an xml element into the existing xml file.

I have xml file as

<Students>
    <student>
        <name>john</>
        <id>123</id>
    </student>
    <student>
        <name>mike</name>
        <id>234</id>
    </student>
</Students>

I want to add new elememt as

    <student>
        <name>NewName</name>
        <id>NewID</id>
    </student>

So my new xml file will be

<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>

For this I have written shell script as

#! /bin/bash

CONTENT="<student>
            <name>NewName</name>
            <id>NewID</id>
        </student>"

#sed -i.bak '/<\/Students>/ i \ "$CONTENT" /root/1.xml
sed -i.bak '/<\/Students>/ i \'$CONTENT'/' /root/1.xml

I am getting error as

sed: can't read <name>NewName</name>: No such file or directory
sed: can't read <id>NewID</id>: No such file or directory
sed: can't read </student>: No such file or directory

And in the xml file, only <student> is added. The remaining elements are not added. Does anyone know why this error?


Solution

  • 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