grepで改行のパターンを与える方法は?


98

grepで改行のパターンを与える方法は?最初に改行、最後に改行。正規表現の方法ではありません。\ nのようなもの。


6
何が欲しいのかはっきりしていません。new line at the beginningは空白行でありnew line at end、ファイル内のすべての行に適用されます。例を投稿できますか?
PP

3
実際には、を使用することができます$。多少制限はありますが、単純な場合に使用できます。
クシシュトフジャブロンスキー

回答:


86

grep パターンは個々の行と照合されるため、入力で見つかった改行とパターンを照合する方法はありません。

ただし、次のような空の行を見つけることができます。

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 

少なくともGNUgrepには、grepをヌル文字で改行する-zオプションがあります。ただし、改行または改行に一致するパターンの\ nをサポートしていないようです。バグレポートを参照してください。
jarno 2016年

1
@ jarno
rubystallion 2018年

92

pcregrep通常の代わりに試してくださいgrep

pcregrep -M "pattern1.*\n.*pattern2" filename

この-Mオプションを使用すると、複数の行にまたがって一致するため、改行をとして検索できます\n


23

@jarnoのおかげで、私は-zオプションについて知っており、GNU grepを-Pオプションとともに使用すると\n照合が可能あることがわかりました。:)

例:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

プリント bar


1
回答に「@jarno」に関する通知が届かないことに注意してください。
jarno 2018年

3
これは素晴らしい!共有していただきありがとうございます!
Alicia Tang

私のために働きます。どうもありがとう。 grep -zoPnir "dex\n035" ./dir/
ガリアン

22

あなたはこのように使うことができます...

grep -P '^\s$' file
  • -PPerl正規表現(POSIXの拡張grep)に使用されます。
  • \s空白文字と一致します。が後に続く場合は*、空の行にも一致します。
  • ^行頭に一致します。$行の終わりに一致します。

2
-PGNU拡張です。状況に応じて(通常は先読み/後読み)使用しても問題ありませんが、POSIXgrepは[[:space:]]。を使用してファイルするだけでこれを実行できます。
jordanm 2012

1
FWIW、Solaris、およびBSDのgrepマンページ(他のページはチェックしていません)の両方に、の段落があり-Pます。とにかくGNUはかなり標準的です。:)
K3 --- rnc 2013年

1
マニュアルページから:[-P]このオプションはFreeBSDではサポートされていません。
マリアンチェルニー

MacOsXにも[-P]はありません:grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e pattern] [-f file] [--binary-files = value] [--color [= when]] [--colour [= when]] [--context [= num]] [--label] [--line-buffered] [--null] [pattern] [file。 ..]
ニコロ・

@Niccolòbrew install grepいくつかの点で優れているGNUGrepを入手したいと思うでしょう。 apple.stackexchange.com/questions/193288/...
herdrick

6

回避策(非ポータブルを使用しない-P)については、改行文字を一時的に別の文字に置き換えて、元に戻すことができます。例:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

基本的に_foo__\n(so __= \n\n)を意味する完全一致を探しています。tr '_' '\n'とにかく各パターンが新しい行に印刷されるので、それを元に戻す必要はありません_。したがって、削除するだけで十分です。


私の無知を許してください、しかしプロセス置換を使用しているのはまだ別の非posix互換ではないので、移植性のない機能ですか?posixシェルではできません<(p paste -sd_ file )でしたか?
humanityANDpeace

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.