それらを含む2つのパターン間の最初の出現を選択する方法


27

それらを含む2つのパターン間で最初の出現を選択するにはどうすればよいですか。sedまたはを使用してくださいawk

私が持っています:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text

P1とP2の間に最初に現れる行が必要です(P1行とP2行を含む)。

something P1 something
content1
content2
something P2 something

回答:


22
sed '/P1/,/P2/!d;/P2/q'

... 範囲内に収まらないdすべての行を削除して、範囲の終わりに最初に遭遇したときにそれを使用することにより、移植性のある仕事をします。P1に先行するP2では失敗せず、単純に記述するためにGNU固有の構文を必要としません。!q


優れた!私よりもずっといい。
ムル

1
@muru-オートプリントをターゲットにしようとすると、ゆがみを回避するのが簡単になることがよくあります-サイクルを機能させます。それは私がとにかく陥った習慣です。おそらくプルーン選択の方法として最もよく説明されていると思います。パターンを検索するのではなく、パターンを無効にする傾向があります
mikeserv

これは、巨大なfileSizeを処理するときにハングします。
Brain90

@ Brain90-してはいけません。クレームを確実に再現できる場合sedは、sed上記のtbeスクリプトではなく、youreのバグです。
mikeserv

1
@mikeserv言わなかったとしたら、言わなかっただろう。私がいくつかのキャラクターを気にするかどうかについてのあなたの懸念は奇妙/P2/qです。それでおしまい。私は何かに興味があり、見つけたものを共有したかった。
Alexej Magura

8

awk

awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something

8

sed

sed -n '/P1/,/P2/p; /P2/q'
  • -nデフォルトの印刷を抑制し、pコマンドを使用して一致するアドレス範囲間の行を印刷します。
  • 通常、これは両方のセクションに一致qするため、最初にP2一致したときに()を終了します。

P2が前に来ると失敗しP1ます。その場合に対処するには、次を試してください:

sed -n '/P1/,/P2/{p; /P2/q}'

1
同意しません; mikeservの答えはあなたのものよりも優れています。
G-Manが「Reinstate Monica」と言う

@ g-man-pshaw。しかし、私は同じことを考えていました。
mikeserv

1
@gman-いいえ。今私はそれを得る。鉱山の方が良い。いいえ{スタック}!
mikeserv

1

パターン自体をスキップしたい場合、awkバージョンは次のとおりです。

awk '/P2/ {exit} /P1/ {f=1; next} f' file

私のために働く。コマンドがどのように機能するかについて、さらに情報を追加できますか?
0xAffe

1

より単純なawkソリューション(iruvarの答えと  muruの答え中間の一種です が、変数を使用しません):

awk '/P1/,/P2/ { print }  /P2/ { exit }'

そして、muruが述べたように、最初のP2が最初のP1の前に現れる場合、これは何も印刷しません。

もちろん、すべてのP1-P2範囲を印刷する場合:

something P1 something
content1
content2
something P2 something
something P1 something
content3
content4
something P2 something

exit一部を省略します。

awk '/P1/,/P2/ { print }'


0

パターン自体をスキップし、単一のGNU sedで最初に一致するブロックのみを表示するには:

sed -nre '/STARTPATTERN/ {:a;n;/ENDPATTERN/{b;};p;ba}' file
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.