【问题标题】:Find string and replace another line in linux [closed]在linux中查找字符串并替换另一行[关闭]
【发布时间】:2018-08-29 20:21:59
【问题描述】:

我有一个如下所示的 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”的字符串,例如,并在 next 行中更改 sn= "2116K000551" 到 sn="11111111",并删除直到行尾的所有内容(意味着 mac="xxx" ts="xx"),除了结束标记 "/>",并保存此文件。我正在尝试使用 sed 来完成,但目前还没有成功。有一个 linux 命令可以做到吗?我非常感谢任何建议。

【问题讨论】:

  • 我建议使用 XML/HTML 解析器(xmlstarlet 或类似的东西)。
  • Stack Overflow 不是代码编写服务。请出示您的代码。由于 Stack Overflow 向您隐藏了关闭原因:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:How to create a Minimal, Complete, and Verifiable example

标签: linux string sed replace


【解决方案1】:

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

【讨论】:

  • 谢谢!看起来 sed 不是一个合适的工具,但 xmlstarlet 看起来更有前途!
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 2019-04-18
  • 2016-09-19
  • 2012-04-11
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多