130 votes

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

Il semble que la nouvelle version d'OSX ne supporte plus grep -P et en tant que tel a fait que 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 zéro, ainsi que \K

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

Toute alternative serait grandement appréciée.

130voto

drevicko Points 1073

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

brew install grep 

Ensuite, il est disponible en tant que ggrep (GNU grep ). il ne remplace pas le système grep (vous devez placer le grep installé avant le grep système dans le fichier PATH ).

La version installée par brew comprend le -P de sorte que vous n'avez 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 à partir de votre bashrc, comme suit

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

Vous pouvez exporter cette ligne dans votre ~/.bashrc ou ~/.zshrc pour la conserver pour les nouvelles sessions.

Veuillez consulter aquí pour une discussion sur les avantages et les inconvénients de l'ancien système. --with-default-names et sa suppression (récente).

82voto

ikegami Points 133140

Si vous voulez faire le minimum de travail, modifiez

grep -P 'PATTERN' file.txt

à

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

et le changement

grep -o -P 'PATTERN' file.txt

à

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

Donc tu as :

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`

13voto

Michael Carman Points 21983

Installer ack et l'utiliser à la place. Ack est un remplacement de grep écrit en Perl. Il a un support complet des expressions régulières Perl.

11voto

nebulous Points 113

OS X a tendance à fournir des outils BSD plutôt que GNU. Le site fait venir avec egrep cependant, ce qui est probablement tout ce dont vous avez besoin pour effectuer des recherches regex.

ejemplo: 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).

7voto

tripleee Points 28746

use perl;

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

Si vous avez besoin de plus grep options (je vois que vous aimeriez -o du moins), il existe plusieurs pgrep des implémentations flottant sur le net, beaucoup d'entre elles en Perl.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X