在linux中查找字符串并替换另一行

时间:2018-03-20 21:02:40

标签: linux string sed replace

我有一个xml文件,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Station name="XxXx" >
  <Inverter name="0701">
    <String name="07.01.01-1">
      <Converter sku="31570014-0900 A" sn="2116K000551" mac="548280000227" ts="01"/>
    </String>
    <String name="07.01.01-2">
      <Converter sku="31570014-0900 A" sn="1716K000232" mac="4482800000E8" ts="02"/>
    </String>

我需要一个脚本(或者更好的一个linux命令),它可以在这个文件中找到一个名为=&#34; 07.01.01-1&#34;的字符串。例如,更改 next 行sn =&#34; 2116K000551&#34;到sn =&#34; 11111111&#34;,删除所有内容直到行尾(表示mac =&#34; xxx&#34; ts =&#34; xx&#34;),除了结束标记&# 34; /&gt;&#34;,然后保存此文件。我试图用sed做这件事,但现在还不成功。是否有一个linux命令可以做到这一点?我非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

使用 xmlstarlet 工具的正确方法:

xmlstarlet ed -u '//String[contains(@name, "07.01.01-1") and ./Converter/@sn = "2116K000551"]
                  /Converter/@sn' -v 11111111 \
-d '//String[contains(@name,"07.01.01-1")]
    /Converter/@*[name()="mac" or name()="ts"]' file.xml

输出:

<?xml version="1.0" encoding="utf-8"?>
<Station name="XxXx">
  <Inverter name="0701">
    <String name="07.01.01-1">
      <Converter sku="31570014-0900 A" sn="11111111"/>
    </String>
    <String name="07.01.01-2">
      <Converter sku="31570014-0900 A" sn="1716K000232" mac="4482800000E8" ts="02"/>
    </String>
  </Inverter>
</Station>

要就地修改文件,请添加-L选项:xmlstarlet ed -L -u ....