Il semble que la nouvelle version d'OSX ne prend plus en charge grep -P
et que certains de mes scripts cessent de fonctionner.
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
J'ai besoin de capturer le grep dans une variable et je dois utiliser les assertions de largeur zéro, ainsi que \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Toute alternative serait grandement appréciée.
-P
? Le mien l'a.grep
fait passé degrep (GNU grep) 2.5.1
10.7 àgrep (BSD grep) 2.5.1-FreeBSD
10.8. Je suppose que c'était à cause de la GPL. FreeBSDgrep
est également basé sur GNUgrep
et les deux versions degrep
datent de 2002.--label
et-u
/--unix-byte-offets
ont également été supprimées dans la version 10.8.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
Et-p
ont été ajoutés à 10,8.-Z
changé de--null
à--decompress
.grep
fourni avec OS X date de 2002, et wiki.freebsd.org/BSDgrep dit toujours que "le seul élément TODO est d'améliorer les performances", alors oui.time grep aa /usr/share/dict/words>/dev/null
prend environ 0,09 seconde avec le grep d'OS X et environ 0,01 seconde avec un nouveau grep GNU lors d'exécutions répétées sur mon iMac.Réponses:
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
Donc vous obtenez:
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 un 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`
la source
| tail -1
à la fin du pipeline.grep
renvoie toujours toutes les lignes correspondantes (sauf si vous utilisez l'une des options où il n'en imprime aucune). Quoi qu'il en soit,if (/.../) { print $1; last; }
il n'imprimera que la première correspondance.say $_->textContent for $doc->findnodes('//loc');
)Si vos scripts sont uniquement pour votre usage, vous pouvez installer à
grep
partir à l'homebrew-core
aidebrew
:brew install grep
Ensuite, il est disponible en tant que
ggrep
(GNUgrep
). il ne remplace pas le systèmegrep
(vous devez mettre le grep installé avant celui du système sur lePATH
).La version installée par
brew
inclut le-P
option, vous n'avez donc pas besoin de modifier vos scripts.Si vous avez besoin d'utiliser ces commandes avec leurs noms normaux, vous pouvez ajouter un répertoire "gnubin" à votre PATH depuis votre bashrc comme:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
Vous pouvez exporter cette ligne sur votre ~ / .bashrc ou ~ / .zshrc pour la conserver pour les nouvelles sessions.
Veuillez consulter ici pour une discussion des avantages et des inconvénients de l'ancienne
--with-default-names
option et de sa suppression (récente).la source
which grep
? Devrait être/usr/local/bin/grep
. C'est un peu méchant de voter avant d'avoir vérifié soigneusement qu'il y a un problème!/usr/local/bin
au début de votre PATH. Brew est censé mettre ça en place, je crois? Avez-vous utilisé--default-names
? Quoi qu'il en soit, content que cela fonctionne (: Je ne suis pas sûr de pirater autour de lui, mais je pense que le système de points est l'une des raisons pour lesquelles ce site est une si bonne ressource.--with-default-names
est d'ajouteralias grep='ggrep'
à votre profil bash et de laisser les dupes de bière conserver leur préfixe--with-default-names
est retiré de l'infusion. Je devaisbrew install grep
obtenir ggrep puis faire comme @rymo dit et fairealias grep='ggrep'
.Installez ack et utilisez-le à la place. Ack est un remplacement de grep écrit en Perl. Il prend totalement en charge les expressions régulières Perl.
la source
ack
est conçu pour être autonome; vous n'avez pas besoin de l'installer. Si vous pouvez enregistrer un fichier, le marquer comme exécutable et le mettre à jourPATH
si nécessaire, vous êtes prêt à partir.ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
signifie la même chose, mais vous n'avez pas besoin du-P
avec ack)OS X a tendance à fournir des outils BSD plutôt que GNU. Il ne vient avec
egrep
cependant, ce qui est probablement tout ce que vous devez effectuer des recherches regex.exemple:
egrep 'fo+b?r' foobarbaz.txt
Un extrait de la page de manuel OSX grep:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
la source
grep -E
au lieu degrep -P
c'était exactement ce dont j'avais besoin.use perl;
perl -ne 'print if /regex/' files ...
Si vous avez besoin de plus d'
grep
options (je vois que vous aimeriez-o
au moins), il existe plusieurspgrep
implémentations flottant sur le net, dont beaucoup en Perl.Si "presque Perl" est assez bon, PCRE est livré avec
pcregrep
.la source
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
la source
Error: No available formula for pcregrep
Que diriez-vous d'utiliser l'option «-E»? Il fonctionne très bien pour moi, par exemple, si je veux vérifier un
php_zip
,php_xml
, l'php_gd2
extension de php -m utilisation I:php -m | grep -E '(zip|xml|gd2)'
la source
É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 j'avais à disposition.
find . -type f -exec perl -nle 'print $& if m{\r\n}' {} ';' -exec perl -pi -e 's/\r\n/\n/g' {} '+'
la source
Celui-ci a fonctionné pour moi:
awk -F":" '/PATTERN/' file.txt
la source
Une autre solution Perl pour -P
var1=$( perl -ne 'print $1 if m#<st:italic>([^<]+)</st:italic># ' file.txt)
la source
utilisez l'expression rationnelle perl one-liner en passant la sortie find avec un tube. J'ai utilisé lookbehind (obtenir les liens src en html) et lookahead pour " et lui ai transmis 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&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 'elasticsearch-2.0'" rel="tag">elasticsearch-2.0</a> <a href="/questions/tagged/elasticsearch-dsl" class="post-tag" title="show questions tagged 'elasticsearch-dsl'" 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 'sharding'" rel="tag">sharding</a> <a href="/questions/tagged/master" class="post-tag" title="show questions tagged 'master'" 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 'linux'" rel="tag">linux</a> <a href="/questions/tagged/camera" class="post-tag" title="show questions tagged 'camera'" 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 'firebase'" 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 'firebase-authentication'" 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 'ios'" rel="tag">ios</a> <a href="/questions/tagged/in-app-purchase" class="post-tag" title="show questions tagged 'in-app-purchase'" rel="tag">in-app-purchase</a> <a href="/questions/tagged/piracy-protection" class="post-tag" title="show questions tagged 'piracy-protection'" 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 'unity3d'" rel="tag">unity3d</a> <a href="/questions/tagged/vr" class="post-tag" title="show questions tagged 'vr'" 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
la source