样本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
不要使用sed
XML 来操作,而是使用 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 变量扩展。不过,出于同样的原因,我们已经转义了模式本身中的双引号。