Es sieht so aus, als würde die neue Version von OSX nicht mehr unterstützt grep -P
und einige meiner Skripte funktionieren daher nicht mehr .
var1=`grep -o -P '(?<=<st:italic>).*(?=</italic>)' file.txt`
Ich muss das grep in einer Variablen erfassen und ich muss auch die Zusicherungen mit der Breite Null verwenden \K
var2=`grep -P -o '(property:)\K.*\d+(?=end)' file.txt`
Alle Alternativen wäre sehr dankbar.
-P
? Meins hat es.grep
tatsächlich vongrep (GNU grep) 2.5.1
10.7 aufgrep (BSD grep) 2.5.1-FreeBSD
10.8 geändert . Ich denke, das lag an der GPL. Das FreeBSDgrep
basiert ebenfalls auf GNUgrep
und beide Versionen vongrep
stammen aus dem Jahr 2002.--label
und-u
/--unix-byte-offets
wurden ebenfalls in 10.8 entfernt.-z
/--decompress
,-J
/--bz2decompress
,--exclude-dir
,--include-dir
,-S
,-O
, Und-p
wurden in 10,8 zugegeben.-Z
geändert von--null
zu--decompress
.grep
mit OS X gelieferte FreeBSD stammt aus dem Jahr 2002, und wiki.freebsd.org/BSDgrep sagt immer noch, dass "das einzige TODO-Element die Verbesserung der Leistung ist", also ja.time grep aa /usr/share/dict/words>/dev/null
dauert mit OS X Grep ungefähr 0,09 Sekunden und mit einem neuen GNU Grep ungefähr 0,01 Sekunden bei wiederholten Läufen auf meinem iMac.Antworten:
Wenn Sie den minimalen Arbeitsaufwand erledigen möchten, ändern Sie
zu
und ändern
zu
So bekommen Sie:
In Ihrem speziellen Fall können Sie mit zusätzlicher Arbeit einfacheren Code erzielen.
quelle
| tail -1
am Ende der Pipeline hinzufügen .grep
Gibt immer alle übereinstimmenden Zeilen zurück (es sei denn, Sie verwenden eine der Optionen, bei denen überhaupt keine gedruckt werden). Auf jeden Fallif (/.../) { print $1; last; }
wird nur die erste Übereinstimmung gedruckt.say $_->textContent for $doc->findnodes('//loc');
)Wenn Ihre Scripts nur für Ihren Gebrauch sind, können Sie installieren
grep
aushomebrew-core
mitbrew
:Dann ist es als
ggrep
(GNUgrep
) verfügbar . Es ersetzt nicht das Systemgrep
(Sie müssen das installierte grep vor dem System eins auf dem platzierenPATH
).Die von installierte Version
brew
enthält die-P
Option, sodass Sie Ihre Skripte nicht ändern müssen.Wenn Sie diese Befehle mit ihren normalen Namen verwenden müssen, können Sie Ihrem PATH aus Ihrem bashrc ein "gnubin" -Verzeichnis hinzufügen, wie:
Sie können diese Zeile in Ihr ~ / .bashrc oder ~ / .zshrc exportieren, um sie für neue Sitzungen beizubehalten.
Bitte beachten Sie hier für eine Diskussion über die pro-s und Nachteile der alten
--with-default-names
Option und es ist (letzten) Entfernung.quelle
which grep
? Sollte sein/usr/local/bin/grep
. Es ist ein bisschen gemein, abzustimmen, bevor Sie sorgfältig geprüft haben, ob es ein Problem gibt!/usr/local/bin
die Vorderseite Ihres Pfades hinzuzufügen . Brew soll das einrichten, glaube ich? Hast du benutzt--default-names
? Wie auch immer, ich bin froh, dass es funktioniert (: Ich bin mir nicht sicher, ob ich es--with-default-names
ist,alias grep='ggrep'
zu Ihrem Bash-Profil hinzuzufügen und--with-default-names
wird aus dem Gebräu entfernt. Ich musstebrew install grep
ggrep bekommen und dann tun, was @rymo sagt und tutalias grep='ggrep'
.Installieren Sie ack und verwenden Sie es stattdessen. Ack ist ein in Perl geschriebener grep-Ersatz. Es bietet volle Unterstützung für reguläre Perl-Ausdrücke.
quelle
ack
ist so konzipiert, dass es in sich geschlossen ist; Sie müssen es nicht tatsächlich installieren. Wenn Sie eine Datei speichern, als ausführbar markieren undPATH
bei Bedarf aktualisieren können, können Sie loslegen .ack -o '(property:)\K.*\d+(?=end)' file.txt
(-o
bedeutet das gleiche, aber Sie brauchen das nicht-P
mit ack)OS X bietet eher BSD- als GNU-Tools. Es kommt mit
egrep
aber das ist wahrscheinlich alles , was Sie regex Suche durchführen müssen.Beispiel:
egrep 'fo+b?r' foobarbaz.txt
Ein Ausschnitt aus der OSX-Grep-Manpage:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
quelle
grep -E
stattdessengrep -P
war genau das, was ich brauchte.use perl;
Wenn Sie mehr
grep
Optionen benötigen (ich sehe, dass Sie-o
zumindest möchten ), gibt es verschiedenepgrep
Implementierungen im Netz, viele davon in Perl.Wenn "fast Perl" gut genug ist, wird PCRE mit ausgeliefert
pcregrep
.quelle
Es gibt noch 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
quelle
Error: No available formula for pcregrep
Wie wäre es mit der Option '-E'? Es funktioniert gut für mich, zum Beispiel, wenn ich für ein überprüfen möchten
php_zip
,php_xml
,php_gd2
Erweiterung von PHP -m I Verwendung:quelle
Entspricht der akzeptierten Antwort, jedoch ohne die Anforderung des -P-Schalters, der auf beiden Maschinen, die ich zur Verfügung hatte, nicht vorhanden war.
quelle
Dieser hat für mich gearbeitet:
quelle
Eine weitere Perl-Lösung für -P
quelle
Verwenden Sie den Perl-Einzeiler-Regex, indem Sie die Suchausgabe mit einer Pipe übergeben. Ich habe lookbehind (get src links in html) und lookahead for "verwendet und die Ausgabe von curl (html) an sie übergeben.
quelle