以下のファイルがあります
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/
一致させます。これらすべての行を「予約済みスペース」に入れてください。Event1
Event2
H
- パート2:
/Event2/{x;/B/p}
行にが含まれている場合は、Event2
コマンドグループを実行します{x;/B/p}
。 - コマンドグループには、
x
との2つの部分もあります/B/p
。 x
「予約済みスペース」のすべてを「パターンスペース」に入れます。/B/p
B
がある場合は、パターンスペースを印刷します。
人間の言語の概念は、と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