在linux中查找字符串并替换另一行[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在linux中查找字符串并替换另一行[关闭]相关的知识,希望对你有一定的参考价值。

我有一个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命令),它可以在这个文件中找到一个名为“07.01.01-1”的字符串,并在下一行中将sn =“2116K000551”更改为sn =“11111111”,删除所有内容直到行尾(表示mac =“xxx”ts =“xx”),但结束标记“/>”除外,并保存此文件。我正在尝试用sed做,但现在还不成功。是否有一个linux命令可以做到这一点?我非常感谢任何建议。

答案

使用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 ....

以上是关于在linux中查找字符串并替换另一行[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在一个字符串中查找源 na 替换参数并在另一个字符串中执行替换

linux下批量查询文件内容字符串并替换

linux下如何将第一行中指定的字符全部替换掉

用字符串中的任何字符查找任何数字和空格的匹配模式并替换为 |在 PHP [关闭]

查找和替换文件中的单词/行

查找和替换文件中与另一个文件中的字符串匹配的子字符串