範囲を使用して3つのフィルタを渡します。

範囲を使用して3つのフィルタを渡します。

ファイルがあります。sample.txt

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:RAM      SAM 
    XY       DUPL
    KEY:UU
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

キーワードに基づいて注文をフィルタリングord:chandruし、key:ZZこれらの項目が見つかったら、ハイフンからハイフンまでの順序を削除して、次の出力を提供します。

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

答え1

GNUがある場合は、awk以下をお勧めします。

gawk 'BEGIN{RS="-+\n"} $0=="" || /ord:chandru/ && /KEY:ZZ/ {ORS=RT; print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

空のレコードを強制的に$0==""印刷します(レコードがハイフン文字列で区切られていると思われる場合は、ファイルの最初の行が解釈される方法です)。


もしあなたならいいえはいgawk、その場合の唯一の違いは、レコード区切り文字を簡単にキャプチャできないことです。これは固定文字列なので、提供した例では大きな問題ではありません。例えばmawk:

mawk 'BEGIN{RS="-------------\n"; ORS=RS} $0=="" || /ord:chandru/ && /KEY:ZZ/ {print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

答え2

これはもう少し信頼性があるはずです。

$ sed -n '1p; /ord:chandru/ {             
N                                           
N
/KEY:ZZ/{
N
/ord:chandru.*\n.*\n.*KEY:ZZ.*\n---.*/p
}
}' file

説明する

  • -n私たちが要求するまで印刷しないでください
  • 1p最初の行を印刷します。ここでは、ハイフンが連結された行が提供されると仮定します(その後、ハイフンがある末尾の行のみを印刷します)。
  • /ord:chandru/パターンを探す
  • N\nその文字を使用して改行を表すために、次の行を読んでください。
  • p一致する行の印刷

答え3

使用アッ:

$ awk 'BEGIN{RS="-------------"};/KEY:ZZ/&&/ord:chandru/{print RS$0}' sample.txt|egrep -v "^ *$"

出力:

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:Z    
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ

答え4

sed -e '
   /^ord:/,/^--*$/!b
   H; /^ord:/h
   /^--*$/!d; g
   /^ord:chandru[ ]/!d
   /\n[ ]*KEY:ZZ\n--*$/!d
'  sample.txt

簡単な要約: /../,/../=>は、あなたの場合のように行の範囲を選択するために使用される範囲演算子です/ord:/ to /----/

私たちのリスはこの範囲(一度に1つの範囲)を保持領域に振ります。その後、範囲の終わりに達すると、/---/`a) /ord:chandru/ && b) /key:ZZ/' 基準に基づいて、その特定の範囲を選択または拒否するときであることがわかります。

関連情報