为了替换两种模式之间的字符串,我使用:
我想要更改的字符串:<name>FOO</name>
我用这个:
s#(<name>).*?(</name)#\1xxxxxxxxxxx\2#g;
我正在寻找解决方案,当第一个模式存在于两行中时:
<attributes>
<name>AUTOR</name>
<value>FOO</value>
<type>1</type>
</attributes>
我想替换BAR
我尝试过类似的东西,但没有结果:
s#(AUTOR</name>\n\r<value>).*?(</value)#\1xxxxxxxxxxx\2#g;
编辑:
我确信使用XMLStarlet
代替SED
。
答案 0 :(得分:1)
面向行的工具通常不适合解析和修改XML数据。而不是sed
,请考虑使用类似XMLStarlet的内容。
使用XMLStarlet:
$ cat data.xml
<attributes>
<name>AUTOR</name>
<value>FOO</value>
<type>1</type>
</attributes>
$ xml ed -u '/attributes/value' -v NEWFOO data.xml
<?xml version="1.0"?>
<attributes>
<name>AUTOR</name>
<value>NEWFOO</value>
<type>1</type>
</attributes>
如果您有更有趣的XML:
<books>
<book>
<attributes>
<name>Author 1</name>
<value>FOO</value>
<type>1</type>
</attributes>
</book>
<book>
<attributes>
<name>Author 2</name>
<value>FOO</value>
<type>1</type>
</attributes>
</book>
</books>
..并且您只想更改FOO
仅为&#34;作者2&#34;,然后
$ xml ed -u '//attributes[name="Author 2"]/value' -v NEWFOO data.xml
<?xml version="1.0"?>
<books>
<book>
<attributes>
<name>Author 1</name>
<value>FOO</value>
<type>1</type>
</attributes>
</book>
<book>
<attributes>
<name>Author 2</name>
<value>NEWFOO</value>
<type>1</type>
</attributes>
</book>
</books>