web-dev-qa-db-ja.com

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

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

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

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

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

代替案は大歓迎です。

71
kugyousha

最小限の作業を行いたい場合は、変更します

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`
56
ikegami

スクリプトが使用専用の場合は、 homebrew-core から grep を使用してbrewをインストールできます。

brew install grep --with-default-names

--with-default-namesを指定すると、システムgrepを置き換えます(実際には、PATHのシステムgrepをシステムの前に置きます)。

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

--with-default-namesなしでインストールした場合、ggrep(GNU grep)として利用可能です。

76
drevicko

ack をインストールして、代わりに使用します。 AckはPerlで書かれたgrepの置き換えです。 Perlの正規表現を完全にサポートしています。

12
Michael Carman

OS Xは、GNUツールではなくBSDを提供する傾向があります。doesegrepが付属しています。

例:_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).

9
nebulous

use Perl;

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

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

「ほぼPerl」で十分であれば、PCREにはpcregrepが付属しています。

6
tripleee

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

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

Homebrewでインストールできます:

brew install pcre

5
Gabor Marton

「-E」オプションを使用してはどうですか?たとえば、php_Zipphp_xmlphp_Gd2拡張子php -mを使用:

php -m | grep -E '(Zip|xml|Gd2)'
3
ZenC

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

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

これは私のために働いた:

    awk  -F":" '/PATTERN/' file.txt
2
petegam

-Pの別のPerlソリューション

var1=$( Perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
0
Rory Hunter

検索出力をパイプで渡すことにより、Perlのワンライナー正規表現を使用します。 lookbehind(get src html内のリンク)とlookahead"に使用し、curl(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
0