使用sed命令替换属性值

时间:2015-08-12 19:03:34

标签: regex xml bash sed

我正在尝试使用sed命令替换属性值,
但只能用空格替换值。

示例输入xml:

<BillingAddress11300000 Tag="11300000" SectionID="BLA" CustAddrName="CLAUDIA LUCIA DE ALMEIDA" CustAddrStreet="AV ENGENHEIRO RICHARD" CustAddrState="RJ" CustAddrZip="20561-090" CustAddrStreetNo="64" CustAddrComplement="APTO 303" CustAddrCity="RIO DE JANEIRO" CustAddrCounty="GRAJAU"/>

替换应使用要处理的属性的名称以及将该属性更改为先前读入的先前变量的值。

所需的输出(对于$ att =&#34; CustAddrName&#34;和$ value =&#34; Rodrigo DE Silva&#34;):

<BillingAddress11300000 Tag="11300000" SectionID="BLA" CustAddrName="Rodrigo DE Silva" CustAddrStreet="AV ENGENHEIRO RICHARD" CustAddrState="RJ" CustAddrZip="20561-090" CustAddrStreetNo="64" CustAddrComplement="APTO 303" CustAddrCity="RIO DE JANEIRO" CustAddrCounty="GRAJAU"/>

我使用了以下脚本

#!/bin/bash 
echo "Enter the attribute name"
read att 
echo "enter new value" 
read value 
sed "s|$att\=\S*\S|$att=\"$value\"|g" test.xml>>out.xml**

使用此脚本,如果属性的当前值没有空格,则可以使用此代码替换属性的值。但是如果值有空间则不可能。

如何实施此方案?

1 个答案:

答案 0 :(得分:0)

您想要替换包含的属性的值 然而,你的sed行通过正则表达式\S*\S非常明确地表示非空格。

你应该改为在一对“'中寻找”除了“之外的所有东西 为此,您可以使用:

sed "s|$att\=\"[^\"]*\"|$att=\"$value\"|g"

给定xml行的输出和$att =“CustAddrName”和$value =“新值”是:

<BillingAddress11300000 Tag="11300000" SectionID="BLA" CustAddrName="new value" CustAddrStreet="AV ENGENHEIRO RICHARD" CustAddrState="RJ" CustAddrZip="20561-090" CustAddrStreetNo="64" CustAddrComplement="APTO 303" CustAddrCity="RIO DE JANEIRO" CustAddrCounty="GRAJAU"/>

然而,操作XML的最佳方法是使用XML解析器或XSL转换。