如何使用 sed 从块中删除重复行 [重复]

Posted

技术标签:

【中文标题】如何使用 sed 从块中删除重复行 [重复]【英文标题】:How to delete duplicate lines from a block using sed [duplicate] 【发布时间】: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/&amp;&amp;/; /^\([ -~]*\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 关键字来绑定区域,而不是遵循格式化的输入呢? 【参考方案1】:

这可能对你有用(GNU sed):

sed -E '/<segment2>/,/<\/segment2>/G;/^([^\n]*)(\n.*)*\n\1(\n|$)/!P;h;d' file

使用介于&lt;segment2&gt;&lt;/segment2&gt; 之间的范围。

将范围内已经看到的内容的副本附加到当前行,如果没有看到,则打印当前行并复制。

否则,删除该行。

【讨论】:

适用于 x64 但不适用于 arm64(busybox)

以上是关于如何使用 sed 从块中删除重复行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

sed简单使用选择性删除

如何在没有sed的情况下替换csv文件中的一行[重复]

如何删除文件中的重复行而不在 Unix 中对其进行排序

如何从sed输出中删除不可见字符到文件[重复]

用于包装嘈杂的python脚本并使用sed删除特定行的shell命令问题[重复]

git:如何使其“意识到”文件已被删除[重复]