XMLSlartlet Grep xml 节点并替换

XMLSlartlet Grep xml node and replace

如何使用 xmlstarlet

查找节点块并替换为自定义块

下面是我的 xml 示例:

<?xml version="1.0" encoding="UTF-8"?>
<job>
    <input>
    <par_denominator nil="true"/>
    <par_follow_source>true</par_follow_source>
    <par_numerator nil="true"/>
    <deblock_enable>Auto</deblock_enable>
    <deblock_strength>0</deblock_strength>
    <no_psi>false</no_psi>
    </input>
 <h264_settings>
    <par_denominator nil="true"/>
    <par_follow_source>true</par_follow_source>
    <par_numerator nil="true"/>
 </h264_settings>
</job>

我想替换所有块包含

    <par_denominator nil="true"/>
    <par_follow_source>true</par_follow_source>
    <par_numerator nil="true"/>

重置价值

    <par_denominator>1</par_denominator>
    <par_follow_source>false</par_follow_source>
    <par_numerator>1</par_numerator>

xmlstarlet 解法:

xmlstarlet ed -u '//*["par_denominator" or "par_numerator"][@nil="true"]' -v 1 \
-u '//par_follow_source[.="true"]' -v 'false' \
-d '//*["par_denominator" or "par_numerator"]/@nil' input.xml

输出:

<?xml version="1.0" encoding="UTF-8"?>
<job>
  <input>
    <par_denominator>1</par_denominator>
    <par_follow_source>false</par_follow_source>
    <par_numerator>1</par_numerator>
    <deblock_enable>Auto</deblock_enable>
    <deblock_strength>0</deblock_strength>
    <no_psi>false</no_psi>
  </input>
  <h264_settings>
    <par_denominator>1</par_denominator>
    <par_follow_source>false</par_follow_source>
    <par_numerator>1</par_numerator>
  </h264_settings>
</job>