ファイルがあります。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/' 基準に基づいて、その特定の範囲を選択または拒否するときであることがわかります。