角かっこの間のテキストを削除しますが、空白行を超えないようにしてください。

角かっこの間のテキストを削除しますが、空白行を超えないようにしてください。

テキスト行が複数のブロックに集まり、各ブロックが少なくとも1つの空白行に分割されているテキストファイルを考えてみましょう。 Bashステートメントを使用して、<またはのすべてのテキストをどのように削除できますか?>\n\n

つまり、各合計ペア<間のすべての項目を削除します>。 aが<終わらない場合は、>ブロックの最後まで(空行)まですべて削除しますが、絶対ブロック外を削除してください!

概念的に安全のために解析する前に、塊をリスト内のオブジェクトに物理的に分離する必要がありますか?それとも、何をしているのかを知っている限り、直線的なテキスト解析操作ですか?

テキスト例:

This is the first
block of text.
                             <-- empty line
<delete me>
This is the second block.
<delete
here>
<delete this, but
                             <-- empty line
do not delete this>
<delete this too>
Third block here.

(more blocks)

結果は次のとおりです。

This is the first
block of text.
                             <-- empty line
This is the second block.
                             <-- empty line
do not delete this>
Third block here.

答え1

awkの短絡モードを試してください。

$ awk -v RS= -v ORS='\n\n' '{gsub(/<[^>]+>?\n?/, "")}1' ip.txt 
This is the first
block of text.

This is the second block.


do not delete this>
Third block here.
  • -v RS=これにより、1つ以上の連続した空行が入力レコード区切り文字として使用されます。
  • -v ORS='\n\n'出力レコード区切り文字を2つの改行に設定
  • gsub(/<[^>]+>?\n?/, "")削除<の後に - 文字以外の文字が続き>、その後にオプションの>文字と改行文字が続きます。
  • 1入力レコードの内容を印刷する慣用的な方法


同じものperl

perl -00 -lpe 'BEGIN{$\="\n\n"} s/<[^>]+>?\n?//g' ip.txt

答え2

牛に似た一種の栄養Awk解決策:

awk -v RS='[<>]' '/\n\n/{ sub(/^[^\n]+\n/, ""); print $0 RT }' file
  • RS='[<>]'<- と>レコード区切り記号として処理
  • /\n\n/- 現在のレコードに2つの改行が含まれている場合:
    • sub(/^[^\n]+\n/, "")- 最初の改行文字を含むすべてを削除します。
    • print $0 RT- 現在のレコードを印刷してからRT(例>:)
    • RT- 記録ターミネーター。指定した文字または正規表現に一致する入力テキストにGawk設定します。RTRS

出力:

<empty line>   
don't delete this>

関連情報