Версия 2.6.37 довольно старая, поэтому вам действительно стоит спросить себя, хотите ли вы этого. Возраст также означает, что многие люди, вероятно, забыли, сколько изменений произошло в то время (я знаю, что у меня есть), но эти версии достаточно близки, и обе версии 2.6, поэтому я предполагаю, что изменений API / ABI не было, а это означает должно быть безопасно обновлять ядро и ничего больше. Но я ничего не обещаю.
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
Вы знаете, что регулярные выражения — неподходящий инструмент для анализа HTML, что легко создать пограничные случаи, которые могут привести к сбою скрипта, но вы настаиваете на использовании не того инструмента? Тогда ладно.
Давайте рассмотрим случаи, которые необходимо охватить. :Может быть
pre
), pre
, pre
внутри строки, pre
внутри строки, pre
более чем на одну строку и даже 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
; вторая часть выполняет манекен минимизации для остальных строк, кроме(!
)для нескольких строк -pre
s.
Вместе,
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
, но нетронуты внутри.