Sed替换保留了前导空白区域

时间:2014-01-15 15:24:42

标签: xml regex linux bash sed

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

e.g。 从:

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

要:

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

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

3 个答案:

答案 0 :(得分:4)

我认为如果不添加更具体的要求,这个简单的解决方案应该没问题:

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

答案 1 :(得分:1)

You can't parse XML with regexes。使用XML处理工具。要替换Attr为“x”且name为“是”的value个节点的值,您可以使用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 :(得分:0)

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

在sed调用之后,将仅在第3行中将第一次出现的“yes”替换为“no”:

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