「ul」が表示されるたびに、次のように見えるように、対応する(最も内側に含まれる)「ul」の後に「name:*****」行を入れようとします。
今後:
<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」の後の「名前」が常に置き換えられるわけではないので、これとこれまで私が見つけたすべてはうまくいきません。誰でもアイデアがあれば聞きたいです。
答え1
ではこれは不可能かもしれません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
Reverse(戻るtac
スペルcat
)を1行ずつ実行して、次のように生成します。
</ul>
name: "Fav",
</ul>
name: "Network",
<li href="https://discordapp.com">Discord</li>
︙
<ul>
︙
<ul>
<ul>
コードの最初の2行は入れ子のレベルをawk
計算します。<ul>
逆順なので</ul>
レベルが上がり <ul>
レベルが下がります。が表示されたら、下からブロックに入っていることを示すように </ul>
設定します。ブロックの一番下の近くでを見つけたら、それを保存してその行に移動します(行を印刷せずに)。 a(つまり、ブロックの先頭)を見つけたら、自分で印刷する前に保存した内容を印刷します。flag
<ul>
name
<ul>
next
name
<ul>
<ul>
name
<ul>
決勝戦では、tac
ラインを反転してほとんどのラインを元の位置に戻し、すべてのラインを元の位置に戻しました。name
後ろに該当する<ul>
。