2つの繰り返しテキストパターンの間にあるすべてのテキストまたは文字を選択します。

2つの繰り返しテキストパターンの間にあるすべてのテキストまたは文字を選択します。

以下はサンプルの.logファイルです(より多くの行がある可能性があります)。

2022 User abc (iii)
2023 defaa <party> ttt
2222221 User def (bbb)
20222 defaa <accoun> ttt
2222 User dddd (aaa)
3333 defaa <hahaha> jmd

User&の間の行を選択したいと思います。ttt

これはログの5行から7行に似ており、このログにはUser&で構成されている行がさらにある場合があります。ttt

Usertttだからあなたがファイルで繰り返されても、&の間のすべての行を取得する方法を知りたいです。

テキストUserttt常に連続した行にあるわけではありません

予想出力:

abc (iii)
2023 defaa <party> 
def (bbb)
20222 defaa <accoun> 

入れ子になった場合は、次のようになります。

2022 User abc (iii)
2222221 User def (bbb)
20222 defaa <accoun> ttt
2023 defaa <party> ttt

予想出力:

def (bbb)
20222 defaa <accoun>

ユーザーとtttは決して同じ行にありません

答え1

マルチキャラクタのGNU awkの略語を使用することはあなたが望むものかもしれませんRSRT\s[:space:]

$ awk -v RS='\\s*ttt' 'RT && sub(/.*User\s*/,"")' file
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>

部分一致を許可したくない場合は、User周囲tttに単語の境界を追加してください。

awk -v RS='\\s*\\<ttt\\>' 'RT && sub(/.*\<User\>\s*/,"")' file

答え2

を使用すると、sedアドレス範囲を選択してUser予約ttt済みスペースに収集できます。

sed '/User/,/ttt/!d;H;/User/h;/ttt/!d;x;s/.*User //;s/ttt.*//' yourfile

上海:

  • /User/,/ttt/User次の範囲まで行を選択しますttt(入れ子になった場合に必要に応じて)。選択項目が反転!してd削除されます。したがって、この手順では、その範囲外のすべての行を削除します。残念ながら、Userファイルの最後から最後までの最後の段落は次のとおりです。いいえ削除されたので、それを削除する方法が必要です。
  • H予約済みスペースにすべての行を追加している間/User/h コピー行がUser予約済みスペースに追加されるため、予約済みスペースにはUser現在の行までのすべての行が含まれます。このようにして、新しいUser行は期待どおりに入れ子になって以前のすべてを上書きします。
  • /ttt/!dなしのすべての行で実行を停止するため、ストレージスペースにttt`のすべての内容をttt収集するまで出力は生成されません。User' to
  • ただし、すべてをまとめたら、xバッファを変更してパターン空間の予約済み領域からその行を取得できます。
  • それからUserすべてを削除してくださいs/.*User //
  • ttt次に始まるすべての項目を削除します。s/ttt.*//

関連情報