sed または awk を使用して、改行またはスペースまで一致するパターンと前の行を印刷します。

sed または awk を使用して、改行またはスペースまで一致するパターンと前の行を印刷します。

「改行までtmpと前行」を印刷したいです。私はUnixを初めて使用します。

たとえば、次のようになります。

AAA
CBH
VFh

GFD
DFC
VGF
HGD
TMP
JHG

TFD
PI1
98A
TMP
TMP
765
UBS

私が望む出力は次のようになります

GFD
DFC
VGF
HGD
TMP

TFD
PI1
98A
TMP
TMP

ベストアンサー1

使用awk:

$ awk -v RS='' -v ORS='\n\n' 'match($0,".*TMP") { print substr($0,1,RLENGTH) }' file
GFD
DFC
VGF
HGD
TMP

TFD
PI1
98A
TMP
TMP

これは、1つ以上の空行で区切られた行セットを1つのレコードとして扱います。レコードが正規表現と一致すると、一致する.*TMP部分の後のビットが削除され、レコードの残りの部分が印刷されます。

TMP正規表現を現在のレコードと.*TMP一致させ、その式に一致するビットのみを印刷して、substr()最後の発生以降のビットを削除できます。正規表現はレコードの先頭から最後のレコードまで一致し、関数はTMP変数match()RLENGTH一致長に設定します。

出力レコード区切り文字として二重改行文字を使用するため、出力の末尾に追加の空行が表示されます。


ファイルが次の場合

AAA
CBH
VFh

GFD
DFC
VGF
HGD
tmp/some/path/here
JHG

TFD
PI1
98A
tmp/some/path/here
tmp/some/path/here
765
UBS

...で始まる行に基づいて同じタイプの変換を実行し、コマンドtmpで使用されている正規表現を変更して、末尾のmatch()「-line」までの改行と一致するようにしますtmp

$ awk -v RS='' -v ORS='\n\n' 'match($0,".*tmp[^\n]*") { print substr($0,1,RLENGTH) }' file
GFD
DFC
VGF
HGD
tmp/some/path/here

TFD
PI1
98A
tmp/some/path/here
tmp/some/path/here

awk状況がどうか100%確信できないことを参考にしてください。しなければならない\n括弧式内で解釈されますが、awk私がアクセスできるすべての実装(OpenBSD awk、OpenBSD mawk、およびGNE awk)はこれを改行文字として扱うようです。いいえ2つの別々の文字で\n

おすすめ記事