【发布时间】:2017-08-07 15:52:39
【问题描述】:
我必须使用 sed 运行这项工作,不知道值 (xxx),但只知道属性 (revision)
<types name="foo" revision="xxx">
到
<types name="foo" revision="5678">
我的第一次尝试是:
sed 's@(revision=\").*@\1$5678\">@'
但它不起作用。
【问题讨论】:
我必须使用 sed 运行这项工作,不知道值 (xxx),但只知道属性 (revision)
<types name="foo" revision="xxx">
到
<types name="foo" revision="5678">
我的第一次尝试是:
sed 's@(revision=\").*@\1$5678\">@'
但它不起作用。
【问题讨论】:
使用以下sed 方法:
sed -Ei 's~( revision=")[^"]+"~\15678"~g' test.xml
-E 选项,允许扩展正则表达式
-i 选项,允许修改文件就地
【讨论】:
您可能可以使用sed 完成工作(在非常简单的情况下),但要编辑xml,这里有更好(且容易出错)的工具,例如xmlstarlet。使用很简单:
xmlstarlet ed -u "//types/@revision" -v 5678 old.xml >new.xml
编辑:
使用perl & XML::LibXML 模块的替代解决方案:
perl -MXML::LibXML -E '$d=XML::LibXML->load_xml(location=>q{file.xml});$_->setAttribute(q{revision},4567)for$d->findnodes(q{//types[@revision]});say $d'
【讨论】:
++ 了解正确的方法。 sed 不推荐用于XML 操作
perl。 :) 即使在 rPI 上也可以有 perl。使用一些XML/XPath perl 模块的解决方案类似...