Text-Processing
使用 sed 在每個 html <ul> 中將最後一行放在首位
每次出現“ul”時,我嘗試將“名稱:*****”行放在相應的(最裡面的)“ul”之後,這樣它看起來像這樣:
前:
<ul> <ul> <li href="https://www.deepl.com/translator">DeepL</li> <li href="https://translate.google.com">Google Trad</li> name: "Translate", </ul> <li href="https://www.youtube.com/feed/subscriptions">Youtube</li> <ul> <li href="https://www.facebook.com/">Facebook</li> <li href="https://twitter.com/">Twitter</li> <li href="https://www.instagram.com">Instagram</li> <li href="https://discordapp.com">Discord</li> name: "Network", </ul> name: "Fav", </ul>
後:
<ul> name: "Fav", <ul> name: "Translate", <li href="https://www.deepl.com/translator">DeepL</li> <li href="https://translate.google.com">Google Trad</li> </ul> <li href="https://www.youtube.com/feed/subscriptions">Youtube</li> <ul> name: "Network", <li href="https://www.facebook.com/">Facebook</li> <li href="https://twitter.com/">Twitter</li> <li href="https://www.instagram.com">Instagram</li> <li href="https://discordapp.com">Discord</li> </ul> </ul>
所以,我已經測試了很多東西,比如:
sed -i -e 'N;s/<ul>\([.\n]*\)\n\(.*\),/\2\n\1' fav.html
這和我現在發現的所有東西都不起作用,因為最後一個“ul”後面的“名稱”並不總是要替換的。如果有人有想法,我很樂意聽到。
這在
sed
. (挑戰已經發出;我等待被證明是錯誤的。)如果您特別需要sed
解決方案,您不妨停止閱讀本文。我能夠通過 和 的組合來做到這
tac
一點awk
:tac fav.html | awk ' /<\/ul>/ { flag=1; level++; } /<ul>/ { print save[level]; level--; } flag && /name/ { flag=0; save[level] = $0; next; } { print; } ' | tac > fav.html.new && mv fav.html.new fav.html
tac fav.html``fav.html
逐行反轉(tac
向後cat
拼寫),因此產生</ul> name: "Fav", </ul> name: "Network", <li href="https://discordapp.com">Discord</li> ︙ <ul> ︙ <ul> <ul>
程式碼的前兩行
awk
計算<ul>
嵌套級別。由於它們是相反</ul>
的順序,因此增加水平並<ul>
降低它。當我們看到 a</ul>
時,我們設置flag
為表示我們正在<ul>
從底部進入一個塊。當我們在name
一個塊的底部附近 找到一個時<ul>
,我們保存它,然後跳到該next
行(不列印該name
行)。當我們找到一個<ul>
(即一個<ul>
塊的開頭)時,我們在列印它本身name
之前列印保存的內容。<ul>
final
tac
再次反轉這些行,將它們中的大部分放回原來的位置,並將每個放在name
對應的<ul>
.