【发布时间】:2020-09-21 11:50:17
【问题描述】:
我想“编辑”一些 xml 文件,这些文件可能在一个文件中多次包含类似的部分。 我需要在每个部分中添加 2 条可能的缺失行(我称之为一对)。即检查“对”是否存在,如果不存在则添加它们。
例如下面是我想添加的可能缺少的对行。
<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', 一旦我到达'结尾</some-tag-to-look-for>',我会做一些可能的改变,然后把它变回'0'。 所以这个inside_a_section_flag,如果是1,意味着我在这个部分里面......所以我需要寻找'pair', 如果我找到了这对,我将inside_a_section_flag变为 1,这意味着我不需要添加这对并且可以退出当前部分.... 但我不知道sed 是否也可以使用变量标志,即根据变量值进行条件替换/更改。这完全应该由 shell 来完成,而应该由 python 脚本来完成?
【问题讨论】:
-
我小时候曾经很喜欢 sed,现在它仍然是我最喜欢的工具之一处理琐碎的任务。它可以用于中等复杂度的任务,但 sedscript 很快就会变得相当神秘。相当高效,但编写、阅读和维护都很糟糕。正如你想要的 1. 解码一个 xml 文件 2. 测试另一个标签中是否存在一个标签 3. 添加一个标签以确保保留 XML 语法,我会在这里使用 Python,它支持带有
xml.etree的 XML模块。不过只是我的意见(因此发表评论)