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

前端 未结 3 503
滥情空心
滥情空心 2020-12-18 03:51

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

I have xml file as


    
        

        
相关标签:
3条回答
  • 2020-12-18 04:39

    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.

    0 讨论(0)
  • 2020-12-18 04:40

    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
    
    0 讨论(0)
  • 2020-12-18 04:49

    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
    
    0 讨论(0)
提交回复
热议问题