前の行にマークがある場合にのみ行を削除してください - sed?それとももっと簡単ですか?

前の行にマークがある場合にのみ行を削除してください - sed?それとももっと簡単ですか?

私はかなり初心者の問題に直面していますが、それが私の関心を集めました:

    </ac:image>
  </a>

後ろ</ac:image>にある</a>行がある行を削除します</a>

以前にも「a href」がありましたが、それは非常に具体的で、sedとmatchを使用して削除しました。この時点で複数行の一致がある場合は、どのように処理するのか疑問に思います。一致する2行目を選択する方法がわかりません。

誰かが私に正しい方向を教えてもらえますか?

答え1

常に同じ順序であれば驚くことはなく、XMLの解析は不要で動作しますsed

常に2行のペアを確認するには、次のN;P;Dパターンを使用しますsed

sed 'N;P;\_</ac:image>\n *</a>$_d;D' filename

どのように動作しますか?

  • N次の行を追加します。通常、$!N次の行があることを確認しますが、お客様の場合は問題になりません。次の行がなければ、特別なことは起こりません。
  • 今、バッファに2行があります。P最初の行を印刷してください。
  • \_</ac:image>\n *</a>$_d d与えられた2行のパターン(\n行間の改行文字)が見つかると、パターンスペースが削除されます。最初の行が印刷されるため、パターン空間を削除すると、ペアの2行目だけが削除されます。
  • 最後のステートメントは、パターンが一致しない場合にのみ実行されます。最初の行(および改行)を削除しD、ペアの2行目にループを再開するので、すべての行のペアがチェックされます。

答え2

gsed '/<\/ac:image>/,+1 { /<\/a>$/d; }' testfile.txt

gsedGNUの略ですsed

関連情報