「改行まで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
。