如何删除除第一个之外的重复 HTML 元素?

How to remove repeated HTML elements except first one?

我有一个 HTML 文件,文件中有一些重复的文本。重复的字符串的字体大小为 4 或 5,我的目标是删除所有这些 重复的字符串,除了第一次出现。

例如:

India! size=5 出现 9 次,size=4 出现 2 次。然后我想删除 size=5 的所有印度外观并保留第一个。

印度!

我已经尝试在 bash 中使用 sed 命令(我愿意接受使用其他工具执行此操作的建议)如下所示,但不起作用,因为在第一场比赛:

sed 's/<font size=\"[4-5]\".*<\/font>//g'

我只得到这个输出:

<!DOCTYPE html> <html> <body> 
<h1>Some header</h1> 
<p>  </p> 
<p> This is other text. </p> 
</body>
</html>

我的输入文件是这样的:

<!DOCTYPE html>
<html>
<body>

<h1>Some header</h1>

    <p>
    <font size="5">India!</font>
        <p>
        <font size="4">Japan!</font>
        </p>
    </p>
    <p>Some text 1</p>
            <p>
                <font size="5">India!</font>
        </p>
    <p>Some text 2</p>
    <p>
            <font size="5">India!</font>
        <p>
            <font size="4">Japan!</font>
            </p>
        </p>
    <p>Some text 3</p>
        <p>
        <font size="5">Uganda!</font>
        </p>
    <p>Some text 4</p>
    <p>
        <font size="5">India!</font>
        <p>
        <font size="4">Japan!</font>
        </p>
        </p>
    <p>Some text 5</p>
        <p>
            <font size="5">India!</font>
        </p>
    <p>Some text 6</p>
        <p>
            <font size="5">Cameroon!</font>
        </p>
    <p>Some text 7</p>
        <p>
                <font size="4">India!</font>
        </p>
    <p>Some text 8</p>
        <p>
            <font size="5">India!</font>
        </p>
    <p>Some text 9</p>
        <p>
            <font size="5">India!</font>
        </p>
    <p>Some text 10</p>
    <p>
        <font size="5">Pakistan!</font>
    </p>
    <p>Some text 11</p>
    <p>
            <font size="5">Pakistan!</font>
    </p>
    <p>Some text 12</p>
    <p>
            <font size="5">India!</font>
        </p>
    <p>Some text 13</p>
        <p>
                <font size="4">Uganda!</font>
        </p>
        <p>
        <font size="5">India!</font>
    </p>
    <p>Some text 14</p>
    <p>
        <font size="4">India!</font>
    </p>

    <p> This is other text. </p>

    </body>
    </html>

我在图像下方以文本格式显示输入(左侧)和所需输出(右侧)并 HTML 预览。

这里有一个 awk 'solution' 给你:

awk -F"[\"<>= ]*" '
 == "font"  { 
  if (!printed[ , ] ) 
    print  
  printed[,] = 1 
  next 
} 
1
'

因为 awk 不是一个健壮的 HTML 解析器,所以它确实不是一个很好的通用解决方案。但是,如果您的输入文件是一致的,这个小脚本可能会起作用。

正如您在评论中所要求的,这里有一个稍微不同的程序也可以删除相关的段落标签。

为了删除要删除的行前后的

(重复项),我发现 运行 遍历文件两次在概念上更容易。

第一次浏览文件时,我跟踪是否像以前一样看到了字体大小和国家/地区的组合。此外,我还跟踪需要删除的行的行号 (FNR)。当 NR == FNR 时,代码 "knows" 第一次通过文件。 NR 是到目前为止的记录总数,FNR 是文件中的记录数。因此,当它们相等时,awk 正在解析第一个文件。

在第二次遍历同一个输入文件时,如果当前记录没有被标记为隐藏,我会打印出它。 FNR 用于索引被抑制的数组,因为 FNR 在文件的第一遍和第二遍中是相同的。

最后,为了告诉 awk 解析文件两次,我们需要在命令行上将输入文件传递给 awk 两次。

这是修改后的代码。我还说明了如何通过将文件(我们称之为 input.html)两次添加到命令行来两次解析您的输入文件:

awk -F"[\"<>= ]*" '
NR == FNR { 
  if (  == "font" )
  {
    if (seen[ , ] ) 
      suppress[ NR - 1 ] = suppress[ NR ] = suppress[ NR + 1 ]  = 1

    seen[,] = 1 
  }
  next 
} 
! suppress[ FNR ] 
' input.html input.html