Sed
如何使用 sed 從 HTML 縮小中排除 pre 標籤?
我正在嘗試使用縮小 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
,而不是其他工具,謝謝。)
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
超過一條線甚至- 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;
將無法正常工作。但是對於 GNUsed
,您可以刪除該程式碼並改用選項。)現在此程式碼在 each 之前和之後-z
添加了一個換行符。將它排到一秒鐘可以減少我們需要關心的案例(並且換行符在外部不會造成傷害)。<pre>``</pre>``sed``<pre>
sed -e '\_<pre>.*</pre>_b' -e '/<pre>/,\_</pre>_!s/>\s*</></g'
對於單行
pre
內容的行,第一部分跳轉到腳本的末尾;第二部分對剩餘的行進行縮小虛擬,除了 (!
) 用於 multi-linepre
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
,但內部未觸及。