以下を使用して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
それぞれです。-z
1秒に設定すると、処理する必要がある場合がはるかに少なくなります(そして改行は外部に害を与えません)。<pre>
</pre>
sed
<pre>
sed -e '\_<pre>.*</pre>_b' -e '/<pre>/,\_</pre>_!s/>\s*</></g'
最初の部分はpre
1行の内容の場合はスクリプトの最後に移動し、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