Как удалить повторяющиеся элементы HTML, кроме первого? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть HTML файл с повторяющимся текстом вдоль документа. Повторные строки имеют размер шрифта 4 или 5, и моя цель состоит в том, чтобы удалить все эти повторяющиеся строки, кроме первого появления.

Например:

India! с размером = 5 появляется 9 раз, и с размером = 4 появляется 2 раза. Тогда я хотел бы удалить все появления Индии с размером = 5 и оставить первое.

Индия!

Я пытался с помощью команды sed в bash (я открыт для предложений сделать это с другими инструментами), как показано ниже, но не работает, потому что удаляет все после первое совпадение:

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 предварительный просмотр.

enter image description here

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Как вы и просили в своем комментарии, здесь есть немного другая программа для удаления также связанных тегов абзаца.

Для того чтобы удалить

и

до и после строк, которые вы хотите удалить (дубликаты), я обнаружил, что концептуально легче выполнить файл дважды.

При первом прохождении файла я отслеживаю, видел ли я комбинацию размера шрифта и страны так же, как и раньше. Кроме того, я также отслеживаю номера строк (FNR) строк, которые необходимо удалить. Код «знает» первый проход по файлу, когда NR == FNR. NR - это общее количество записей, а FNR - это номер записи в файле. Таким образом, когда они равны, awk анализирует первый файл.

Во втором проходе через тот же входной файл я распечатываю текущую запись, если она не помечена как подавленная. FNR используется для индексации подавленного массива, потому что FNR на первом проходе совпадает со вторым проходом файла.

Наконец, чтобы сообщить awk о синтаксическом анализе файла дважды, нам нужно передайте входной файл в awk дважды в командной строке.

Вот пересмотренный код. Я также иллюстрирую, как проанализировать ваш входной файл дважды, добавив файл (назовем его input.html) два раза в командную строку:

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

    seen[$4,$5] = 1 
  }
  next 
} 
! suppress[ FNR ] 
' input.html input.html
1 голос
/ 26 февраля 2020

Вот вам «решение» для awk:

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

Поскольку awk не является надежным парсером HTML, на самом деле это не очень хорошее общее решение. Однако, если ваши входные файлы непротиворечивы, этот небольшой скрипт может помочь.

...