通过多行匹配,使用sed或其他方法编辑xml文件

2024-09-30 16:20:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想“编辑”一些xml文件,它们可能在一个文件中多次包含类似的部分。 我需要在每个部分中添加2条可能缺失的行(我称之为一对)。。i、 e.检查“配对”是否存在,如果不存在,则添加它们

下面是我想添加的可能缺少的对线

<arg>--possibleMissedKey</arg>
<arg>possibleMissedValue</arg>

下面的文件有一对,所以我不需要添加它们 但是,如果部分中有任何一个遗漏了这一对,我想将这一对添加到部分中。。此外,每个部分中的行数也是不可预测的


    <some-tag-section-not-interesting>
        some contents not interesting to me
    </some-tag-section-not-interesting>
    <some-tag-to-look-for>
        <some stuff - a> ..... </some stuff - a>
        <arg>--possibleMissedKey</arg>
        <arg>possibleMissedValue</arg>
        <something-else-not-interesting>blahblah</something-else-not-interesting>
    </some-tag-to-look-for>
    <some-tag-to-look-for>
        <some stuff - b>....</some stuff - b>
        <arg>--possibleMissedKey</arg>
        <arg>possibleMissedValue</arg>
        <something-else-not-interesting>blahblah</something-else-not-interesting>
    </some-tag-to-look-for>

所以我考虑了几个选项,但每个人都有一个问题:

  • 我首先想到的是“sed”。我希望替换结尾标签 </some-tag-to-look-for>

        <arg>--possibleMissedKey</arg>
        <arg>possibleMissedValue</arg>
     </some-tag-to-look-for> 

即,基本上将其添加到本节的最后一部分。 但是我不知道我是否可以在sed中“多行模式匹配”。我没有使用所谓的“等待空间”。 我的sed经验是检查“当前单行”中的一些字符串

  • 我希望检查的另一个选项是引入一个inside_a_section_flag,初始值为“0”。开始读取文件,当我发现一个开始的<some-tag-to-look-for>时,我将该inside_a_section_flag转换为“1”, 一旦到达“ending</some-tag-to-look-for>”,我会做一些可能的更改,并将其返回到“0”。 所以这个inside_a_section_flag,如果它是1,意味着我在节的内部。。。。所以我需要寻找“一对”, 如果我找到了这对,我将inside_a_section_flag变成1,这意味着我不需要添加这对,并且可以退出当前部分。。。。 但我不知道sed是否也可以使用变量标志,即基于变量值进行条件替换/更改

  • 这是否应该由shell来完成,而应该由python脚本来完成


Tags: 文件tofortagargnotsectionsome
1条回答
网友
1楼 · 发布于 2024-09-30 16:20:00

这可能适用于您(GNU-sed):

sed '/<some-tag-to-look-for>/{:a;n;/<arg> possibleMissedKey<\/arg>/b;/<\/some-tag-to-look-for>/!{h;ba};x;s/\S.*/<arg> possibleMissedKey<\/arg>/p;s//<arg> possibleMissedValue<\/arg>/p;x}' file

在包含<some-tag-to-look-for>的行上进行匹配

在下面几行中循环

如果遇到包含<arg> possibleMissedKey</arg>的行,请退出

否则,如果当前行与</some-tag-to-look-for>不匹配,请复制并重复

找到结束标记后,使用复制的行作为模板插入所需的两行(以便保留缩进)

相关问题 更多 >