web-dev-qa-db-fra.com

grep -P ne fonctionne plus. Comment réécrire mes recherches?

Il semble que la nouvelle version d'OSX ne prend plus en charge grep -P et en tant que tel, certains de mes scripts ont cessé de fonctionner.

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

J'ai besoin de capturer le grep dans une variable et j'ai besoin d'utiliser les assertions de largeur nulle, ainsi que \K

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

Toute alternative serait grandement appréciée.

71
kugyousha

Si vous voulez faire le minimum de travail, changez

grep -P 'PATTERN' file.txt

à

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

et changer

grep -o -P 'PATTERN' file.txt

à

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

Vous obtenez donc:

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`

Dans votre cas spécifique, vous pouvez obtenir du code plus simple avec un travail supplémentaire.

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

Si vos scripts sont réservés à votre usage, vous pouvez installer grep à partir de homebrew-core en utilisant brew :

brew install grep --with-default-names

Lorsque vous spécifiez --with-default-names, il remplace le système grep (en fait, place le grep installé avant celui du système sur le PATH).

La version installée par brew inclut le -P option, vous n'avez donc pas besoin de modifier vos scripts.

Si vous installez sans --with-default-names, il est alors disponible sous la forme ggrep (GNU grep).

76
drevicko

Installez ack et utilisez-le à la place. Ack est un remplacement grep écrit en Perl. Il prend entièrement en charge les expressions régulières Perl.

12
Michael Carman

OS X a tendance à fournir BSD plutôt que GNU. Il ne vient avec egrep cependant, ce qui est probablement tout ce dont vous avez besoin pour effectuer des recherches d'expression régulière).

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

Un extrait de la page de manuel d'OSX grep:

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 ...

Si vous avez besoin de plus d'options grep (je vois que vous aimeriez -o au moins) il existe diverses implémentations pgrep flottant sur le net, la plupart en Perl.

Si "presque Perl" est suffisant, PCRE est livré avec pcregrep.

6
tripleee

Il existe une autre alternative: pcregrep.

Pcregrep est un grep avec des expressions régulières compatibles Perl. Il a exactement le même usage que grep -P. Il sera donc compatible avec vos scripts.

Il peut être installé avec homebrew:

brew install pcre

5
Gabor Marton

Que diriez-vous d'utiliser l'option "-E"? Cela fonctionne bien pour moi, par exemple, si je veux vérifier un php_Zip, php_xml, php_Gd2 extension de php -m J'utilise:

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

Équivalent de la réponse acceptée, mais sans l'exigence du commutateur -P, qui n'était pas présent sur les deux machines dont je disposais.

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

Celui-ci a fonctionné pour moi:

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

Une autre solution Perl pour -P

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

utilisez l'expression rationnelle à une ligne Perl en passant la sortie de recherche avec un tuyau. J'ai utilisé lookbehind (get src liens en html) et lookahead pour " et passé la sortie de 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
Rohit Malgaonkar