Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell脚本中使用sed命令在XML文件中添加XML元素_Xml_Bash_Shell_Sed - Fatal编程技术网

在shell脚本中使用sed命令在XML文件中添加XML元素

在shell脚本中使用sed命令在XML文件中添加XML元素,xml,bash,shell,sed,Xml,Bash,Shell,Sed,我正在使用sed命令将一个xml元素插入到现有的xml文件中 我将xml文件作为 <Students> <student> <name>john</> <id>123</id> </student> <student> <name>mike</name> <id>234</

我正在使用sed命令将一个xml元素插入到现有的xml文件中

我将xml文件作为

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

厕所
123
迈克
234
我想添加新的元素作为

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

新名称
纽伊德
因此,我的新xml文件将

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

厕所
123
迈克
234
新名称
纽伊德
为此,我将shell脚本编写为

#! /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
#/bin/bash
内容=”
新名称
纽伊德
"
#sed-i.bak'//i\“$CONTENT”/root/1.xml
sed-i.bak'//i\'$CONTENT'/'/root/1.xml
我得到的错误是

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
sed:无法读取NewName:没有这样的文件或目录
sed:无法读取NewID:没有这样的文件或目录
sed:无法读取:没有这样的文件或目录
在xml文件中,只添加了
。 未添加其余元素。 是否有人知道此错误的原因?

更改此错误:

CONTENT="<student>
            <name>NewName</name>
            <id>NewID</id>
        </student>"
CONTENT=”
新名称
纽伊德
"
为此:

CONTENT="<student>\n<name>NewName</name>\n<id>NewID</id>\n</student>"
CONTENT=“\nNewName\nNewID\n”
然后:

C=$(echo $CONTENT | sed 's/\//\\\//g')
sed "/<\/Students>/ s/.*/${C}\n&/" file
C=$(echo$CONTENT | sed's/\//\\\//g')
sed//s/*/${C}\n&/“文件

在sed替换文本中不能有未替换的换行符,即示例中的
$CONTENT
。sed像shell一样使用换行符来终止命令

如果在替换文本中需要换行符,则需要在其前面加反斜杠

还有另一种使用
r
选项添加文本的方法。例如:

假设您的主文件是

$ cat file
<Students>
    <student>
        <name>john</>
        <id>123</id>
    </student>
    <student>
        <name>mike</name>
        <id>234</id>
    </student>
</Students>
然而,给出了这个选项后,用正则表达式解析xml仍然是一个非常糟糕的主意。它使溶液非常脆弱,容易破碎。把这看作是一个学习练习。 这可能适合您(GNU-sed&Bash):

CONTENT=<\
新名称\
纽伊德\
'
sed'//i\'“$CONTENT”文件
或者,将新生放入一个文件中,然后:

sed '/<\/Students>/e cat new_student_file' file
sed'/e cat new\u student\u文件

有几种工具可以操作XML文件。使用这些而不是正则表达式。@devnull如果您能列出其中的一个(或两个)工具,那就太好了。如果我的标记是新名称,那么如何处理这里的空白\t'将添加一个制表符,我需要一个空格如果标记像新名称,那么我如何处理这个空格。@变量的Optimus只需记住每行的最后一个字符(但最后一个)必须以“\”结尾。对于文件解决方案,只需编写您看到的文本。
$ 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>
CONTENT='    <student>\
    <name>NewName</name>\
    <id>NewID</id>\
</student>'

sed '/<\/Students>/i\'"$CONTENT" file
sed '/<\/Students>/e cat new_student_file' file