各grepの一致後、他の特定の一致まで行を表示する方法は?


45

"-A NUM"スイッチを使用することで、一致するたびに特定の数の後続行を出力できることを知っています。各マッチの後に特定の単語が見つかるまで末尾の行を印刷することが可能かどうか疑問に思っています。たとえば、「Word A」を検索するとき、「Word A」を含む行と、「Word D」を含む行までの行を表示したい。

状況:

Word A
Word B
Word C
Word D
Word E
Word F

コマンド:

grep -A10 'Word A'

この出力が必要です:

Word A
Word B
Word C
Word D

回答:


74

Word A」と「Word D」(包括的)の間の行を印刷したいようです。のsed代わりに使用することをお勧めしますgrep。必要なパターンで開始および終了する入力ストリームの範囲を編集できます。sed範囲内のすべての行を印刷し、他の行は印刷しないように指示する必要があります。

sed -n -e '/Word A/,/Word D/ p' file

(OPだけでなく一般的な状況でも)それを排他的にする方法に関するヒントはありますか?
2rs2ts

4
@ 2rs2tsを排他的にするために、| sed -e '1d;$d'最初の行と最後の行を削除するだけで追加します
-holroy

間のすべての行を除外する場合、つまり、2つの一致の範囲外の行だけを表示する場合sed -n -e '/pattern A/,/pattern D/d; p'は、「パターンAからパターンDに削除して、他のすべてを印刷する」と言います。残念ながら、この試合は貪欲です。つまり、パターンAとDが複数回出現する場合、最初のパターンAから最後のパターンDに一致することになります。その場合、PerlまたはPythonがあなたの友達ではないかと思います。
fbicknel

16

なぜawkを使用しないのですか?

awk '/Word A/,/Word D/' filename

2
多数のファイルが関係している場合、sedはこれをはるかに効率的に実行できるようです。awkの方が覚えやすいかもしれませんが、sedは私の頭の中の付箋に値するようです。
ジムニム14年

1
awkはWord D、と同じ行にWord Aある場合、および場合によっては別の場所にある場合に優れています。たとえばWord A Word D\nWord D、sedを使用すると、awkが1行を表示する2行が表示されます。さらにawkで変数を使用することもできます。たとえばawk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file"、sedはより効率的かもしれませんが、同じ行にある場合もそうでない場合もある2つの文字列の検索を処理する場合、awkは確実に信頼性が高くなります。
S0AndS0

そのawkの良さそうですが、ファイルのシーケンスを含む場合を扱いABし、あなただけのような各配列との間に何をキャプチャしたいです。私の場合、少なくともsedはこれらのセマンティクスに従っていないようです。
マタン

9
perl -lne 'print if /Word A/ .. /Word D/' file

または

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
+1でドライブバイダウン投票に対抗します。sed区切り線を選択するためにPerlの正規表現の力が必要でない限り、私はこれに引き続き使用します。
トリプリー

70年代にsedを書いた人々は感謝しなければなりません:-)
Matan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.