在shell脚本中使用sed命令在XML文件中添加XML元素
我正在使用sed命令将一个xml元素插入到现有的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</
<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