如何替换 XML 文件中的字符串?

Gan*_*esh 1 xml sed awk perl

我正在尝试替换 XML 文件中的字符串。

<hello="value" exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,aa=bb ccc,dd=eeee,ff=gggg,hh=iii,jj=kkk,ll=mmmm" />
Run Code Online (Sandbox Code Playgroud)

我只想更换

aa=bb ccc,dd=eeee
Run Code Online (Sandbox Code Playgroud)

xx=yy yyy,zz=aaaa,bb=cc ddd
Run Code Online (Sandbox Code Playgroud)

如何实现这一目标?谢谢

Kus*_*nda 6

假设 XML 格式良好,如下所示:

<?xml version="1.0"?>
<root>
  <hello exmapleno="Other attribute's value"/>
  <hello exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,aa=bb ccc,dd=eeee,ff=gggg,hh=iii,jj=kkk,ll=mmmm"/>
</root>
Run Code Online (Sandbox Code Playgroud)

...那么您可以使用 替换节点中属性值的aa=bb ccc,dd=eeee一部分,如下所示:examplenohelloxmlstarlet

xmlstarlet edit \
    --var searchstring '"aa=bb ccc,dd=eeee"' \
    --var replacement  '"xx=yy yyy,zz=aaaa,bb=cc ddd"'  \
    --update '//hello/@exampleno[contains(.,$searchstring)]' \
    --expr 'concat(
        substring-before(.,$searchstring),
        $replacement,
        substring-after(.,$searchstring)
    )' file.xml
Run Code Online (Sandbox Code Playgroud)

(请注意,--var变量是 Xpath 表达式,因此字符串必须包含文字双引号。)

或者,XPath 表达式中没有花哨的变量:

xmlstarlet edit \
    --update '//hello/@exampleno[contains(.,"aa=bb ccc,dd=eeee")]' \
    --expr 'concat(
        substring-before(.,"aa=bb ccc,dd=eeee"),
        "xx=yy yyy,zz=aaaa,bb=cc ddd",
        substring-after(.,"aa=bb ccc,dd=eeee")
    )' file.xml
Run Code Online (Sandbox Code Playgroud)

这将修改文档中包含带有搜索字符串的属性的所有节点。 您是否想要手动选择这些节点之一,然后使用比.helloexampleno//hello

该命令的作用是定位所有与XPath 表达式匹配的节点//node/@exampleno(即exampleno所有hello节点的属性),附加条件是该值必须包含搜索字符串。然后它根据--expr表达式更新匹配属性的值。该表达式挑选出属性值中目标字符串(第一次出现)之前和之后的部分,并将它们与中间的新字符串连接起来。

输出被写入终端,但您将使用适当命名的选项进行就地编辑--inplace

测试运行,使用缩短的选项名称:

$ xmlstarlet ed --var s '"aa=bb ccc,dd=eeee"' --var r '"xx=yy yyy,zz=aaaa,bb=cc ddd"' -u '//hello/@exampleno[contains(.,$s)]' -x 'concat(substring-before(.,$s),$r,substring-after(.,$s))' file.xml
<?xml version="1.0"?>
<root>
  <hello exmapleno="Other attribute's value"/>
  <hello exampleno="xxxx:yyyyyyyy/dd=eeeee-ffffff,xx=yy yyy,zz=aaaa,bb=cc ddd,ff=gggg,hh=iii,jj=kkk,ll=mmmm"/>
</root>
Run Code Online (Sandbox Code Playgroud)

  • @Ganesh 在这种情况下,我会亲自与我的经理交谈,让他们与管理员及其团队交谈。系统管理员在公司的角色是提供可用的计算机系统,员工可以使用该系统来使公司和利益相关者受益。是的,我们可以给您一个“sed”单行代码,但是请让您的经理和系统管理员知道“sed”单行代码无法可靠地解析 XML,并且您不应对任何损失负责因运行低于标准的代码而造成的收入或其他损失。另外,我不会为你写那句台词。 (3认同)