Задание Cron не работает (или, по крайней мере, запись в файл должна быть)

Вы знаете, что регулярные выражения — неподходящий инструмент для анализа 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, но нетронуты внутри.

0
19.07.2021, 23:46
0 ответов

Теги

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