各HTMLの前に最後の行を置きます。sedで

各HTMLの前に最後の行を置きます。sedで

「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.htmlfav.htmlReverse(戻る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>nextname<ul><ul>name<ul>

決勝戦では、tacラインを反転してほとんどのラインを元の位置に戻し、すべてのラインを元の位置に戻しました。name 後ろに該当する<ul>

関連情報