【问题标题】:Sed substitution preserving leading white spacesSed 替换保留前导空格
【发布时间】:2014-02-04 03:44:47
【问题描述】:

我一直在尝试编写一个 sed 命令来替换单行上的单个单词,保留所有前导空格和单词。

例如 来自:

<Attr name="x" value="yes"/>

收件人:

<Attr name="x" value="no"/>

我知道我可以重写整行,但我更喜欢更优雅的方式。 谢谢!

【问题讨论】:

  • 你在哪里卡住了?
  • sed 不会触及空格,除非你告诉它。您是如何尝试sed 却没有得到正确结果的?

标签: xml regex linux bash sed


【解决方案1】:

You can't parse XML with regexes。使用 XML 处理工具。要替换Attr 节点的值,其中name 为“x”且value 为“yes”,您可以使用xmlstarlet 之类的工具:

echo '<doc>
  <Attr name="x" value="yes"/>
  <Attr name="y" value="yes"/>
  <Attr name="x" value="maybe"/>
</doc>' |
xmlstarlet ed -u '//Attr[@name="x"][@value="yes"]/@value' -v "no"
<?xml version="1.0"?>
<doc>
  <Attr name="x" value="no"/>
  <Attr name="y" value="yes"/>
  <Attr name="x" value="maybe"/>
</doc>

【讨论】:

  • 我还没有尝试过,但它似乎是最好的解决方案,也是最灵活的!非常感谢!!!
【解决方案2】:

我认为在不添加更多具体要求的情况下,这个简单的解决方案应该没问题:

sed 's/"yes"/"no"/'

【讨论】:

  • 您可能希望将其更改为s/"yes"/"no"s/\&lt;yes\&gt;/no,这样您就不会意外更改任何其他内容。
  • 非常感谢您的回答!但我认为这不是一个有效的解决方案,因为(我的错我没有解释它)该文件包含多个条目,您的解决方案会更改整个文件。
  • 可以在s前加上目标行号。
【解决方案3】:

Lajos 的解决方案将重写文件中出现的许多单词 - 这可能不是您想要的。

在 sed 调用之后,将仅在第 3 行将 file.xml 中第一次出现的“是”替换为“否”:

sed -i 3s/yes/no/ file.xml

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2012-09-14
    相关资源
    最近更新 更多