sedを使用してHTMLの縮小から辞書タグを除外するには?

sedを使用してHTMLの縮小から辞書タグを除外するには?

以下を使用してHTMLを縮小しようとしています。sed

<pre>私の問題:タグ内のものは縮小したくありませんが、うまくいくことはできません。

これが私が使用するものです:

sed ':a;N;$!ba;s@>\s*<@><@g' $html_file > ${html_file//.html/.minhtml}

これにより、preタグ内のコンテンツを含むすべてのコンテンツが縮小されます。

試してみましたが、^[pre]うまくいきません...

私も以下を使ってみましたsed /skipme/! s/foo/bar/

sed ':a;N;$!ba; /<pre>\.*<\/pre>/! s@>\s*<@><@g' $html_file > ${html_file//.html/.minhtml}

sed(…はい、他のツールの代わりにそれに固執しています。ありがとうございます。)

答え1

正規表現は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それぞれです。-z1秒に設定すると、処理する必要がある場合がはるかに少なくなります(そして改行は外部に害を与えません)。<pre></pre>sed<pre>

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

最初の部分はpre1行の内容の場合はスクリプトの最後に移動し、2番目の部分は!複数行()を除く残りの行を減らしますpre

一緒に、

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

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 scratch-sed サンプルコレクション

関連情報