【发布时间】:2018-12-05 12:05:23
【问题描述】:
我有一个包含许多子目录的目录,每个子目录都包含一个我要编辑的config.xml 文件。喜欢:
../jobs/foo_bar-v1.2_west/config.xml
../jobs/foo_bar-v1.3_west/config.xml
../jobs/foo_stuff-v1.3_east/config.xml
../jobs/foo_foo-v9.8_north/config.xml
../jobs/NOT_FOO-v0.1_whatev/config.xml
etc.
在匹配特定行的第一个实例<properties> 之后,我需要一种方法将多行文本插入到多个../jobs/foo*/config.xml 文件中。
要插入的文本如下所示:
<a.bunch.of.TextGoesHere>
<permission>one.foo.Items.Foo:person.name</permission>
<permission>two.foo.Items.Foo:person.name</permission>
<permission>three.foo.Items.Foo:person.name</permission>
</a.bunch.of.TextGoesHere>
每个../jobs/foo*/config.xml 看起来像:
<?xml version='1.0' encoding='UTF-8'?>
<foo1>
<actions/>
<description>foo2</description>
<keepDependencies>false</keepDependencies>
<properties>
<foo3/>
</properties>
...
<lots_of_other_stuff>
<properties>
<junk>
</properties>
每个config.xml 的最终输出应如下所示:
<?xml version='1.0' encoding='UTF-8'?>
<foo1>
<actions/>
<description>foo2</description>
<keepDependencies>false</keepDependencies>
<properties>
<a.bunch.of.TextGoesHere>
<permission>one.foo.Items.Foo:person.name</permission>
<permission>two.foo.Items.Foo:person.name</permission>
<permission>three.foo.Items.Foo:person.name</permission>
</a.bunch.of.TextGoesHere>
<foo3/>
</properties>
...
<lots_of_other_stuff>
<properties>
<junk>
</properties>
我尝试使用sed 在特定行之后插入,例如
#!/bin/bash
find ../jobs/run* -name config.xml -exec sed -i '6a\
<text to insert>' {} \;
但偶尔,config.xml 中的长 <description> 文本会导致插入不可预测的行号。
接下来我尝试使用sed 搜索<properties> 的第一个实例并在之后插入,例如
sed -i '0,/properties/a test' config.xml
但这导致在每一行之后添加test 测试,直到找到<properties>。使用sed -i '1,/ 有类似的结果。太丑了。
我不确定我是否在这个 Amazon Linux 机器上正确使用了 sed,并且我认为 awk 在这里可能会更好。有人可以帮忙吗?谢谢。
【问题讨论】:
-
我强烈推荐 XSLT 来编辑 XML。看到这个重复的q:stackoverflow.com/q/3649195/7552