【问题标题】:How do I replace atributes of XML file by using shell scripting sed command?如何使用 shell 脚本 sed 命令替换 XML 文件的属性?
【发布时间】:2017-12-10 12:20:52
【问题描述】:
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.ionic.starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
...
</widget>

如何使用 sed 替换小部件中的 id 和版本?

【问题讨论】:

  • 不要使用 sed 处理 XML 文件。使用可识别 XML 的工具。
  • 我有使用内置函数的限制。因为我将在多个服务器上运行它
  • 与设置约束的人交谈。它们毫无意义。

标签: xml bash shell ionic-framework sed


【解决方案1】:

使用 xmlstarlet:

xmlstarlet edit -N x='http://www.w3.org/ns/widgets' \
                --update "//x:widget/@id" --value "foo" \
                --update "//x:widget/@version" --value "bar" file.xml

输出:

<?xml version="1.0" encoding="utf-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" id="foo" version="bar">
...
</widget>

如果要就地编辑文件,请添加选项-L

【讨论】:

  • 如何更改此行中的电子邮件和 href 和值 example.com/">Author name
  • @rakshans1:我建议您开始一个新问题并指出您是否在 XML 文件中使用命名空间 (xmlns="...")。
【解决方案2】:

Sed 不是处理 XML 的正确工具,因为属性可能以不同的顺序和/或不同的行出现,但仍保持相同的语义。

使用 XML 感知工具。例如,在xsh(我目前维护的XML::LibXML 的包装)中,你可以写

open file.xml ;
register-namespace w http://www.w3.org/ns/widgets ;
set /w:widget/@id "new.id" ;
set /w:widget/@version "0.0.2" ;
save :b ;  # :b creates a backup.

【讨论】:

  • 我需要在不安装任何依赖项的情况下实现这一点..有可能..??
  • 这取决于已经安装的内容。有许多类似的工具,例如XMLStarlet,甚至 xmllint 也有一些有限的功能。
  • fresh linux..而且顺序总是一样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2014-06-07
  • 2014-06-03
  • 2016-11-04
  • 2017-12-03
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多