使用sed脚本替换过滤行的特定部分

时间:2016-12-19 16:27:44

标签: sed

给定一个由以下行组成的xml文件:

<dependency field="no_change" name="test" conf="blahblah"/>
<dependency field="to_be_picked_up" name="test" conf="blahREPLACE_ME"/>

我希望能够识别字段值等于 to_be_picked_up 的行(可以是除特定字符串之外的任何内容,例如 no_change )和将字符串 REPLACE_ME 替换为特定字符串。

我已经使用以下命令进行了一些行级更改,但我不知道如何编写逻辑脚本来替换 REPLACE_ME 的逻辑只能在字段值可以分开的行中从to_be_picked_up中找到conf =&#34;&#34;中的变化。

sed -e 's/<dependency \(.*\)\(\.*\)>/\<dependency \1\/\>/'

2 个答案:

答案 0 :(得分:1)

不要使用sed编辑XML。使用支持XML的工具。例如,在xsh中,我碰巧维护了一个基于libxml的工具,你可以编写

open file.xml ;
for //dependency[@field="to_be_picked_up"]/@conf
    set . xsh:subst(., 'REPLACE_ME', 'RESULT') ;
save :b ;

答案 1 :(得分:0)

sed '/field="no_change"/!s/REPLACE_ME/whatever/'

使用xmlstarlet,它将是:

xmlstarlet ed -u '//dependency[@field!="no_change"]/@conf' -x 'concat(substring-before(.,"REPLACE_ME"), "whatever", substring-after(., "REPLACE_ME"))'