Sed

如何使用 sed 從 HTML 縮小中排除 pre 標籤?

  • January 20, 2020

我正在嘗試使用縮小 HTMLsed

我的問題:我不想縮小<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

來自sed 便箋簿 - 一個 sed 範例執行緒

您知道正則表達式是 HTML 解析的錯誤工具,很容易創建邊緣情況以使腳本失敗,但您堅持使用錯誤的工具?好吧。

讓我們看看要涵蓋的案例: 可以有

  • 沒有任何預格式化文本的行(進一步稱為pre),
  • 一行pre
  • 一些pre在一條線上,
  • 一行內不止一個pre
  • pre超過一條線甚至
  • apre從前一個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,您可以刪除該程式碼並改用選項。)現在此程式碼在 each 之前和之後-z添加了一個換行符。將它排到一秒鐘可以減少我們需要關心的案例(並且換行符在外部不會造成傷害)。<pre>``</pre>``sed``<pre>

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

對於單行pre內容的行,第一部分跳轉到腳本的末尾;第二部分對剩餘的行進行縮小虛擬,除了 ( !) 用於 multi-line 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,但內部未觸及。

引用自:https://unix.stackexchange.com/questions/519788