【发布时间】:2021-12-13 01:29:11
【问题描述】:
假设我们有如下示例所示的一行代码:
<segment1>
<element="1" prop="blah"/>
<element="2" prop="blah"/>
.
.
</segment1>
<segment2>
<element="1" prop="blah"/>
<element="2" prop="blah"/>
.
.
<element="1" prop="blah"/>
<element="2" prop="blah"/>
</segment2>
<segment3>
<element="1" prop="blah"/>
<element="2" prop="blah"/>
.
.
</segment3>
例如,此处的段 2 有重复项,需要删除(此处排序无关紧要)。那么现在如何绑定 sed 以仅从段 2 中删除重复项。 在此示例中,段 2 是第二段,可能并非所有可能的情况都如此,因为它也可能是子集的子集。
我对此的想法是使用标签,以命令gsed -ni 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'开始和结束
【问题讨论】:
-
标准建议:Don't Parse XML/HTML with regular expressions;而是使用 XML 解析器,例如 DOM、SAX、StAX 或 XSLT。
-
... 和 XSLT 处理器将非常适合此任务,而
sed则不是,即使我们假设 XML 输入的格式严格规则。 -
例如,仅从段 2 中删除 specifically 可以很容易地保证输入的格式,但让
sed自己弄清楚它需要从段 2 中删除,或者哪些特定的行,如果可能的话,将是非常困难的。 -
如果我们使用 start 和 end 关键字来绑定区域,而不是遵循格式化的输入呢?
标签: xml bash sed command-line gnu-sed