パターンマッチングでgrep

パターンマッチングでgrep

以下のファイルがあります

Event1
A
B
C
Event2
CC
CC
DD
Event1
E
N
D
Event2 

これでイベント1とイベント2の間をsedでき、その間のすべての行を取得できますが、私が望むのは、イベント1とイベント2の間の行に出力する内容として「B」がある場合にのみsedすることです。だから私の出力は次のようになります

Event1
A
B
C
Event2

ベストアンサー1

sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' filename

説明する:

  • sedプログラムは/Event1/,/Event2/Hとの2つの部分で構成されています/Event2/{x;/B/p}
  • パート1:との間のすべての行を/Event1/,/Event2/一致させます。これらすべての行を「予約済みスペース」に入れてください。Event1Event2H
  • パート2:/Event2/{x;/B/p}行にが含まれている場合は、Event2コマンドグループを実行します{x;/B/p}
  • コマンドグループには、xとの2つの部分もあります/B/p
  • x「予約済みスペース」のすべてを「パターンスペース」に入れます。
  • /B/pBがある場合は、パターンスペースを印刷します。

人間の言語の概念は、とEvent1の間のすべての行を書くことですEvent2。これがわかったら、あなたが気づいEvent2たすべての行を見てください。あればB印刷してください。それ以外の場合は無視されます。


上記のsedプログラムには「バグ」があります。

入力が次の場合:

Event1x
A
B
C
Event2x
CC
CC
DD
Event1y
E
N
D
Event2y
CC
CC
DD
Event1z
X
B
X
Event2z

出力は次のとおりです。

$ sed -n '/Event1/,/Event2/H;/Event2/{x;/B/p}' foo

Event1x
A
B
C
Event2x
Event2y
Event1z
X
B
X
Event2z

Event2y最初の空白行を参照してください。これはsedの性質によるものです。

sed プログラムを変更すると、Event2y空行が置き換えられます。これは基本的に最初の空行と同じ理由です。

sed -n '/Event1/,/Event2/H;/Event2/{s/.*//;x;/B/p}' filename

出力例

$ sed -n '/Event1/,/Event2/H;/Event2/{s/.*//;x;/B/p}' filename

Event1x
A
B
C
Event2x

Event1z
X
B
X
Event2z

空白行はsed-fuを使用して変更できますが、それを修正するには評判ポイントが必要です。


sedの詳細をご覧ください!! 1

おすすめ記事