Как мне исключить предварительные теги из минимизации HTML с помощью sed?

Версия 2.6.37 довольно старая, поэтому вам действительно стоит спросить себя, хотите ли вы этого. Возраст также означает, что многие люди, вероятно, забыли, сколько изменений произошло в то время (я знаю, что у меня есть), но эти версии достаточно близки, и обе версии 2.6, поэтому я предполагаю, что изменений API / ABI не было, а это означает должно быть безопасно обновлять ядро ​​и ничего больше. Но я ничего не обещаю.

-1
19.05.2019, 21:28
2 ответа
sed ':a;$!{N;ba;};s/@/@a/g;s/\n/@n/g;s/<pre/\n&/g;s/<\/pre>/&\n/g' test.html \
  | sed -r '/(^<pre|<\/pre>$)/!{s/@n//g;s/>\s+</></g;}' \
  | sed ':a;$!{N;ba;};s/\n//g;s/@n/\n/g;s/@a/@/g' >min.html

Из Блокнот sed --Цепочка примеров sed .

1
28.01.2020, 05:07

Вы знаете, что регулярные выражения — неподходящий инструмент для анализа HTML, что легко создать пограничные случаи, которые могут привести к сбою скрипта, но вы настаиваете на использовании не того инструмента? Тогда ладно.

Давайте рассмотрим случаи, которые необходимо охватить. :Может быть

  • строк без предварительно отформатированного текста (далее именуемые pre),
  • строка из pre,
  • некоторые preвнутри строки,
  • более одного preвнутри строки,
  • a preболее чем на одну строку и даже
  • a pre, начинающееся в строке, где заканчивался предыдущий pre.

Все эти случаи есть в этом примере файла:

<x>    </x>
<pre>_ _</pre>
_ <pre>_</pre> _<x>    </x>_
_ <pre>_</pre> _<x>    </x> _ <pre>_</pre> _
_ <pre>_<x>    </x>_
_</pre> _
_<x>    </x>_<x>    </x>_
_ <pre>_
_<x>    </x>_<x>    </x>_
_</pre> _ <pre>
_
<x>    </x>_
</pre>

Чтобы избежать множественной реализации части минимизации, давайте разделим preи не-preпострочно в первом проходе:

sed -z -e 's/<pre>/\n&/g;s_</pre>_&\n_g'

(Очевидно, вы используете GNU sed, иначе ваш :a;N;$!ba;не работал бы. Но для GNU sedвы можете отказаться от этого кода и вместо него использовать опцию -z. )Теперь этот код добавляет разрыв строки перед каждым <pre>и после каждого </pre>. Передача этого в секунду sedдает нам гораздо меньше случаев, о которых нужно заботиться (, а разрывы строк не причиняют вреда снаружи<pre>).

sed -e '\_<pre>.*</pre>_b' -e '/<pre>/,\_</pre>_!s/>\s*</></g'

Первая часть переходит в конец скрипта для строк с однострочным -содержимым pre; вторая часть выполняет манекен минимизации для остальных строк, кроме(!)для нескольких строк -pres.

Вместе,

sed -z -e 's/<pre>/\n&/g;s_</pre>_&\n_g' file.html | sed -e '\_<pre>.*</pre>_b' -e '/<pre>/,\_</pre>_!s/>\s*</></g'

производит

<x></x>

<pre>_ _</pre>

_ 
<pre>_</pre>
 _<x></x>_
_ 
<pre>_</pre>
 _<x></x> _ 
<pre>_</pre>
 _
_ 
<pre>_<x>    </x>_
_</pre>
 _
_<x></x>_<x></x>_
_ 
<pre>_
_<x>    </x>_<x>    </x>_
_</pre>
 _ 
<pre>
_
<x>    </x>_
</pre>

и — вуаля — пробелы удалены снаружи pre, но нетронуты внутри.

2
28.01.2020, 05:07

Теги

Похожие вопросы