需要使用shell脚本替换xml属性值

需要使用shell脚本替换xml属性值

样本input.xml文件

<user dn="CN=company,DN=Department">
<role name="ROLE_ADMIN"/>
</user>

输出应该是

<user dn="String_1,String_2">
<role name="ROLE_ADMIN"/>
</user>

请就上述问题陈述向我提出建议。注意:dn 不应该被硬编码,因为该值也可以为空。例如 dn=""

答案1

不要使用sedXML 来操作,而是使用 XML 感知工具,例如xmlstarlet

xmlstarlet ed -u '/user/@dn' -v 'String1, String2' input.xml

答案2

使用命令行 XML 解析器/编辑器XML小星

$ company="The Company"
$ department="The Department"

$ dn="CN=$company,DN=$department"

$ xml ed -t -u '/user/@dn' -v "$dn" input.xml
<?xml version="1.0"?>
<user dn="CN=The Company,DN=The Department">
  <role name="ROLE_ADMIN"/>
</user>

该命令将查找dn根节点的属性user并将其值编辑为$dn扩展后的值。

为了便于dn稍后解析属性,可能值得在公司名称和DN属性值中的以下内容之间使用更突出的分隔符​​。例如 a;而不是 a ,。或者将它们作为单独的属性添加到user节点中。

答案3

如果该<user...>行始终独立,那么这是 sed 中的一个简单表达式

sed "s/^<user .*/<user dn=\"$string1,$string2\">/" input.xml

现在这样写使得$string1$string2都是变量。

因此,例如:

$ string1="hello"
$ string2="there"
$ sed "s/^<user .*/<user dn=\"$string1,$string2\">/" input.xml
<user dn="hello,there">
<role name="ROLE_ADMIN"/>
</user>

您可以使用sed -i“就地”替换,这将重写input.xml.

答案4

sed是你的朋友

 sed '/^<user dn=/s/CN=[^,]*,DN=[^"]*\"/String_1,String2/' filename

应该这样做。如果您希望实时选择String_1& ,您可以使用变量来实现这一点。String_2我会写一个脚本

#!/bin/bash
read -p"Enter string1" str1
read -p"Enter string2" str2
sed -i "/^<user dn=/s/CN=[^,]*,DN=[^\"]*\"/$str1,$str2/" /path/to/input.xml

-i选项会立即修改文件。


笔记

sed 脚本中使用双引号是因为它们允许 bash 变量扩展。不过,出于同样的原因,我们已经转义了模式本身中的双引号。


相关内容