grep -P funktioniert nicht mehr wie kann ich meine Suchen umschreiben

Es sieht so aus, als ob die neue Version von OSX grep -P nicht mehr unterstützt und somit einige meiner Skripts nicht mehr funktioniert.

var1=`grep -o -P '(?<=).*(?=)' file.txt` 

Ich muss das grep zu einer Variablen erfassen und ich muss die Zusicherungen der Breite null verwenden. sowie \ K

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

Alle Alternativen würden sehr geschätzt werden.

Wenn Sie die minimale Menge an Arbeit erledigen möchten, ändern Sie

 grep -P 'PATTERN' file.txt 

zu

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

und ändern

 grep -o -P 'PATTERN' file.txt 

zu

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

So bekommst du:

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

In Ihrem speziellen Fall können Sie mit zusätzlicher Arbeit einen einfacheren Code erzielen.

 var1=`perl -nle 'print $1 if m{(.*)}' file.txt` var2=`perl -nle 'print $1 if /property:(.*\d+)end/' file.txt` 

Wenn deine Skripte nur für dich bestimmt sind, kannst du grep aus homebrew-core mit brew installieren:

 brew install grep --with-default-names 

Wenn Sie --with-default-names angeben, ersetzt es das System grep (setzt das installierte grep vor das System auf dem PATH ).

Die von brew installierte Version enthält die Option -P , sodass Sie Ihre Skripte nicht ändern müssen.

Wenn Sie ohne --with-default-names installieren, ist es als ggrep (GNU grep ) verfügbar.

Installiere ack und benutze es stattdessen. Ack ist ein Grep-Ersatz in Perl geschrieben. Es bietet volle Unterstützung für reguläre Perl-Ausdrücke.

OS X bietet eher BSD als GNU-Tools. Es kommt jedoch mit egrep , was wahrscheinlich alles ist, was Sie brauchen, um Regex-Suchen durchzuführen.

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

Ein Ausschnitt aus der OSX grep man-Seite:

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

use perl;

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

Wenn Sie mehr grep Optionen benötigen (ich sehe, dass Sie zumindest -o ), gibt es verschiedene pgrep Implementierungen im Netz, viele davon in Perl.

Wenn “fast Perl” gut genug ist, wird PCRE mit pcregrep .

Es gibt eine andere Alternative: pcregrep .

Pcregrep ist ein Grep mit Perl-kompatiblen regulären Ausdrücken. Es hat genau die gleiche Verwendung wie grep -P . So wird es mit Ihren Skripten kompatibel sein.

Es kann mit Homebrew installiert werden:

brew install pcre

Wie wäre es mit der Option “-E”? Es funktioniert gut für mich, wenn ich zum Beispiel nach einer php_zip , php_xml , php_gd2 Erweiterung von php -m php_xml php_gd2 :

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

Äquivalent der angenommenen Antwort, aber ohne die Anforderung des -P-Schalters, der auf beiden Rechnern nicht vorhanden war.

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

Dieser hat für mich funktioniert:

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

Eine weitere Perl-Lösung für -P

 var1=$( perl -ne 'print $1 if m#([^< ]+)# ' file.txt) 

Verwenden Sie die Perl-Einzellinien-Regex, indem Sie die Find-Ausgabe mit einer Pipe übergeben. Ich habe Lookbehind verwendet ( src- Links in html) und Lookahead für und habe die Ausgabe von curl (html) daran übergeben.

 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             
  • Batchdatei mit dem Befehl psql ohne Passwort ausführen
  • Vergleichen von Zahlen in Bash
  • N Befehle mit Pipes in einer Shell verbinden?
  • Wie Standarderrors in einer Variablen in einem Bash-Skript gespeichert werden
  • Warum gibt ein Shell-Skript Syntaxerrors, wenn derselbe Code anderswo funktioniert?
  • Löschen Sie Zeilen in einer Textdatei, die eine bestimmte Zeichenfolge enthalten
  • Android adb, database mit Run-as abrufen