gpt4 book ai didi

xml - 如何使用 awk 在多个文件中第一次匹配模式后插入多行

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:35 24 4
gpt4 key购买 nike

我有一个包含许多子目录的目录,每个子目录包含一个 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.

我需要一种方法将多行文本插入到多个 ../jobs/foo*/config.xml 中文件,匹配特定行的第一个实例后,<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>

每个../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>' {} \;

但偶尔,长<description>来自 config.xml 的文字导致要插入的行号不可预测。

接下来我尝试使用 sed搜索 <properties> 的第一个实例并在之后插入,例如

sed -i '0,/properties/a test' config.xml

但这导致添加了 test在每一行之后测试直到 <properties>被找到。使用 sed -i '1,/有类似的结果。很丑。

我不确定我是否在使用 sed正确安装在这个 Amazon Linux 机器上,我在想 awk在这里可能会更好。有人可以帮忙吗?谢谢。

最佳答案

假设要插入的文本位于名为 insert 的文件中:

sed -e '0,/<properties>/{/<properties>/r insert' -e '}' config.xml

r 命令读取文件并将其追加到当前行之后;

0,/pattern/{/pattern/r filename}

确保只有 pattern 的第一个实例会附加文本。因为命令必须在 r 读取的文件名之后结束,所以必须使用 -e 将它分成两部分。

要就地编辑文件,请使用 sed -i(对于 GNU sed)。

要对多个文件执行此操作,您可以使用 find:

find jobs -name 'config.xml' \
-exec sed -i -e '0,/<properties>/{/<properties>/r insert' -e '}' {} +

这要求 insert 文件位于您运行此命令的目录中。


你的命令看起来几乎是正确的,只是你没有将第二个地址嵌套到你的范围中以确保追加只发生一次。

关于xml - 如何使用 awk 在多个文件中第一次匹配模式后插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51048454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com