grep-Pは機能しなくなりました。検索を書き直すにはどうすればよいですか?


98

新しいバージョンのOSXはサポートさgrep -Pれなくなったようです。そのため、一部のスクリプトが機能しなくなりました。

var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`

grepを変数にキャプチャする必要があり、ゼロ幅アサーションを使用する必要があります。 \K

var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`

任意の代替案をいただければ幸いです。


8
gnu grepをインストールするのはどうですか?
ケント

あなたはそれがあります確信していますか-P?私はそれを持っています。
ケビン

4
@ Kevin10.8で削除されました。
lri 2013年

8
@AdrianFrühwirthOSXgrepgrep (GNU grep) 2.5.1、実際には10.7からgrep (BSD grep) 2.5.1-FreeBSD10.8に変更されました。GPLのせいだと思います。FreeBSDgrepもGNUに基づいてgrepおり、両方のバージョンはgrep2002年のものです。--labelおよび-u/--unix-byte-offetsも10.8で削除されました。-z/ --decompress-J/ --bz2decompress--exclude-dir--include-dir-S-O、および-p10.8で添加しました。-Zから--nullに変更されました--decompress
lri 2014

3
grepOS Xに付属しているFreeBSDは2002年のものであり、wiki.freebsd.org / BSDgrepはまだ「唯一のTODO項目はパフォーマンスの向上です」と言っているので、そうです。time grep aa /usr/share/dict/words>/dev/null私のiMacで繰り返し実行すると、OS Xのgrepでは約0.09秒、新しいGNUGrepでは約0.01秒かかります。
lri 2014

回答:


68

最小限の作業を行いたい場合は、変更してください

grep -P 'PATTERN' file.txt

perl -nle'print if m{PATTERN}' file.txt

と変更

grep -o -P 'PATTERN' file.txt

perl -nle'print $& while m{PATTERN}g' file.txt

だからあなたは得る:

var1=`perl -nle'print $& while m{(?<=<st:italic>).*(?=</italic>)}g' file.txt`
var2=`perl -nle'print $& while m{(property:)\K.*\d+(?=end)}g' file.txt`

特定のケースでは、追加の作業でより単純なコードを実現できます。

var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt`
var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`

1
これはうまく機能しますが、使用したgrepが最初の一致のみを返したため、すべての一致が返されます。最初の試合だけを返す方法について何か考えはありますか?
くぎょうしゃ2013年

1
@ironintention:| tail -1パイプラインの最後に追加します。
ピーター

grep常に一致するすべての行を返します(まったく出力しないオプションの1つを使用しない限り)。とにかく、if (/.../) { print $1; last; }最初の一致のみを出力します。
ikegami 2013

私はこれを使ってサイトマップのURLを取得しました-ありがとうございます。あなたの投稿がなければできなかったでしょう!perl -nle'print $ 1 if m {<loc>(。*)</ loc>} 'sitemap.xml
Christian

2
@ Christian、XML :: LibXMLなどの適切なXMLパーサーでそれを行うのに3行しかかかりません。(キーライン:say $_->textContent for $doc->findnodes('//loc');
ikegami 2013

92

あなたのスクリプトは、あなたの使用のためのものである場合は、インストールすることができますgrepから、homebrew-core使用してbrew

brew install grep 

その後、ggrep(GNU grep)として利用できます。システムを置き換えるものではありませんgrep(インストールされているgrepをシステムのgrepの前に配置する必要がありますPATH)。

によってインストールされたバージョン brewれたには-Pオプション含まれているため、スクリプトを変更する必要はありません。

これらのコマンドを通常の名前で使用する必要がある場合は、次のようにbashrcからPATHに「gnubin」ディレクトリを追加できます。

PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

この行を〜/ .bashrcまたは〜/ .zshrcにエクスポートして、新しいセッションのために保持することができます。

古いオプションの長所と短所、およびその(最近の)削除については、こちらをご覧ください--with-default-names


3
@pepper何がうまくいかなかったのですか?パスが正しく設定されていない可能性があります-出力はwhich grep何ですか?する必要があります/usr/local/bin/grep。問題があることを注意深くチェックする前に、反対票を投じることを意味します。
drevicko 2014年

2
おそらく/usr/local/bin、PATHの前に追加する方がよいでしょう。ブリューは私が信じていることを設定することになっていますか?使用しました--default-namesか?それを回避ハッキングについてはわからないが、私はポイントシステムは、このサイトでは、このような優れたリソースである理由の一つだと思います。とにかく、喜んでそれは(動作します。
drevicko

1
はい、私は--default-namesとbrewを使用しました。パスの前に/ usr / local / binを置くことがエイリアスよりも優れているかどうかわからない、単なる代替手段
ペッパー

10
別の方法--with-default-namesalias grep='ggrep'、bashプロファイルに追加して、brew dupesにプレフィックスを保持させることです
rymo 2015

4
--with-default-names醸造から削除されます。brew install grepggrepを取得してから、@ rymoの言うとおりに実行する必要がありましたalias grep='ggrep'
ヘンジ

12

ackをインストールして、代わりに使用してください。Ackは、Perlで記述されたgrepの代替品です。Perl正規表現を完全にサポートしています。


これをチェックしたいのですが、これは仕事用のコンピューター用なので、何もインストールできません
kugyousha 2013年

@ironintention:Perlモジュールをインストールできれば、問題ありません。ローカルのPerlインストールに追加できない場合でも、いつでもlocal :: libを使用できます。
マイケルカーマン2013年

ack自己完結型になるように設計されています。実際にインストールする必要はありません。ファイルを保存し、実行可能としてマークしPATH、必要に応じて更新できる場合は、問題ありません。
トリプリー2014年

上記を置き換えるack構文を喜ばせてください
William Entriken 2016年

@FullDecent:それはほとんど同じです:ack -o '(property:)\K.*\d+(?=end)' file.txt-o手段同じことが、あなたは必要としない-PACKとを)
マイケル・カーマン

11

OS Xは、GNUツールではなくBSDツールを提供する傾向があります。付属してますegrep、おそらくあなたは正規表現検索を実行するために必要なすべてである、しかし。

例: egrep 'fo+b?r' foobarbaz.txt

OSX grepのmanページからの抜粋:

grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).


5
egrepとしての直接呼び出しは非推奨です。grep-Eと同じ機能も利用できます。それは...のPerlの悲しい影だ、前後参照アサーションを欠く、バックスラッシュエスケープ、オプション、条件文のほとんどは、等:(パワーユーザーはそれを嫌うだろうが、それは少なくとも、仕事をしない。
デウィ・モーガン

1
ありがとう。grep -E代わりにgrep -P私が必要としていたものでした。
asmaier

6

use perl;

perl -ne 'print if /regex/' files ...

より多くのgrepオプションが必要な場合(-o少なくとも必要だと思います)pgrep、ネット上にはさまざまな実装があり、その多くはPerlです。

「ほぼPerl」で十分な場合、PCREにはが付属していpcregrepます。


5

別の選択肢があります:pcregrep

Pcregrepは、Perl互換の正規表現を持つgrepです。とまったく同じ使用法grep -Pです。したがって、スクリプトと互換性があります。

それは自作でインストールすることができます:

brew install pcre


Error: No available formula for pcregrep
アーロンブレイガー2015

GaborMarton、@ Martinの修正コメントを含めるように回答を編集し、最小限の変更を乗り越えるためにフォーマットを少し移動する必要がありました。
ダニエルベアード

3

'-E'オプションを使用するのはどうですか?たとえば、を確認したい場合は、問題なく動作しますphp_zipphp_xmlphp_gd2から延長PHP -m I使用:

php -m | grep -E '(zip|xml|gd2)'

1
これは機能します。Macは
FreeBSDgrepを

2

受け入れられた回答と同等ですが、使用可能な両方のマシンに存在しなかった-Pスイッチの要件はありません。

find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'



0

find出力をパイプで渡すことにより、perlワンライナー正規表現を使用します。私は使用後読み(取得SRC HTML内のリンクを)と先読みをするために と、それにカール(HTML)の出力を可決しました。

bash-3.2# curl stackoverflow.com | perl -0777 -ne '$a=1;while(m/(?<=src\=\")(.*)(?=\")/g){print "Match #".$a." "."$&\n";$a+=1;}'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  239k  100  239k    0     0  1911k      0 --:--:-- --:--:-- --:--:-- 1919k
Match #1 //ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
Match #2 //cdn.sstatic.net/Js/stub.en.js?v=fb6157e02696
Match #3 https://ssum-sec.casalemedia.com/usermatch?s=183712&amp;cb=https%3A%2F%2Fengine.adzerk.net%2Fudb%2F22%2Fsync%2Fi.gif%3FpartnerId%3D1%26userId%3D
Match #4 //i.stack.imgur.com/817gJ.png" height="16" width="18" alt="" class="sponsor-tag-img">elasticsearch</a> <a href="/questions/tagged/elasticsearch-2.0" class="post-tag" title="show questions tagged &#39;elasticsearch-2.0&#39;" rel="tag">elasticsearch-2.0</a> <a href="/questions/tagged/elasticsearch-dsl" class="post-tag" title="show questions tagged &#39;elasticsearch-dsl&#39;" rel="tag
Match #5 //i.stack.imgur.com/817gJ.png" height="16" width="18" alt="" class="sponsor-tag-img">elasticsearch</a> <a href="/questions/tagged/sharding" class="post-tag" title="show questions tagged &#39;sharding&#39;" rel="tag">sharding</a> <a href="/questions/tagged/master" class="post-tag" title="show questions tagged &#39;master&#39;" rel="tag
Match #6 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/linux" class="post-tag" title="show questions tagged &#39;linux&#39;" rel="tag">linux</a> <a href="/questions/tagged/camera" class="post-tag" title="show questions tagged &#39;camera&#39;" rel="tag
Match #7 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/firebase" class="post-tag" title="show questions tagged &#39;firebase&#39;" rel="tag"><img src="//i.stack.imgur.com/5d55j.png" height="16" width="18" alt="" class="sponsor-tag-img">firebase</a> <a href="/questions/tagged/firebase-authentication" class="post-tag" title="show questions tagged &#39;firebase-authentication&#39;" rel="tag
Match #8 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/ios" class="post-tag" title="show questions tagged &#39;ios&#39;" rel="tag">ios</a> <a href="/questions/tagged/in-app-purchase" class="post-tag" title="show questions tagged &#39;in-app-purchase&#39;" rel="tag">in-app-purchase</a> <a href="/questions/tagged/piracy-protection" class="post-tag" title="show questions tagged &#39;piracy-protection&#39;" rel="tag
Match #9 //i.stack.imgur.com/tKsDb.png" height="16" width="18" alt="" class="sponsor-tag-img">android</a> <a href="/questions/tagged/unity3d" class="post-tag" title="show questions tagged &#39;unity3d&#39;" rel="tag">unity3d</a> <a href="/questions/tagged/vr" class="post-tag" title="show questions tagged &#39;vr&#39;" rel="tag
Match #10 http://pixel.quantserve.com/pixel/p-c1rF4kxgLUzNc.gif" alt="" class="dno
bash-3.2# date
Mon Oct 24 20:57:11 EDT 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.