Ich habe diesen regulären Ausdruck:
(?<=prefix).*$
Dies gibt ein beliebiges Zeichen nach der Zeichenfolge "Präfix" zurück und funktioniert problemlos auf allen Online-Regex-Engines (z . B. https://regex101.com ). Das Problem ist, wenn ich diesen Regex in Bash verwende:
grep '(?<=prefix).*$' <<< prefixSTRING
es passt zu nichts. Warum funktioniert dieser reguläre Ausdruck nicht mit grep?
grep
regular-expression
mark009
quelle
quelle
.*$
stimmt das mit einer beliebigen Zeichenfolge bis zum Zeilenende (oder dem Ende der Zeichenfolge) überein, nicht nur mit einem beliebigen Zeichen.Antworten:
Sie haben anscheinend den richtigen regulären Ausdruck definiert, aber nicht die ausreichenden Flags in der Befehlszeile gesetzt, um ihn
grep
zu verstehen. Weil standardmäßiggrep
BRE unterstützt und mit-E
flag ERE. Was Sie haben (Vorausschau), ist nur in der PCRE-Regex-Variante verfügbar, die nur in GNUgrep
mit ihrem-P
Flag unterstützt wird.Angenommen, Sie müssen nur die übereinstimmende Zeichenfolge extrahieren, nachdem
prefix
Sie ein zusätzliches Flag hinzufügen müssen, um-o
mitzuteilen,grep
dass nur der übereinstimmende Teil als gedruckt wirdEs gibt auch eine Version
grep
, die standardmäßig PCRE-Bibliotheken unterstützt -pcregrep
in der Sie dies einfach tun könnenDetaillierte Erklärungen zu verschiedenen Regex-Varianten finden Sie in dieser wundervollen Antwort von Giles und in den Tools, mit denen sie implementiert werden
quelle
Reguläre Ausdrücke gibt es in vielen verschiedenen Geschmacksrichtungen. Was Sie anzeigen, ist ein Perl-ähnlicher regulärer Ausdruck (PCRE, "Perl Compatible Regular Expression").
grep
macht POSIX reguläre Ausdrücke. Dies sind einfache reguläre Ausdrücke (BRE) und erweiterte reguläre Ausdrücke (ERE, fallsgrep
mit der-E
Option verwendet). Weitere Informationen finden Sie im Handbuchre_format
oder in einemregex
ähnlichen Handbuch, auf das sich Ihrgrep
Handbuch auf Ihrem System bezieht, oder in den POSIX-Standardtexten, auf die ich gerade verwiesen habe.Wenn Sie GNU verwenden
grep
, können Sie Perl-ähnliche reguläre Ausdrücke verwenden, wenn Siegrep
die GNU-grep
spezifische-P
Option verwenden.Beachten Sie auch , dass die
grep
Renditen Linien standardmäßig nicht Strings aus Linien. Wiederum können Sie mit GNUgrep
(und einigen anderengrep
Implementierungen) die-o
Option verwenden, um nur die Bits zu erhalten, die dem angegebenen Ausdruck aus jeder Zeile entsprechen.Beachten Sie, dass beide
-P
und-o
keine Standarderweiterungen der POSIX-Spezifikation von sindgrep
.Wenn Sie GNU nicht verwenden
grep
, können Siesed
stattdessen Folgendes verwenden , um das Bit zwischen dem Stringprefix
und dem Zeilenende abzurufen:Auf diese Weise werden nur die Zeilen gedruckt,
sed
auf die die angegebene Ersetzung angewendet werden kann. Die Ersetzung ersetzt die gesamte Zeile, die mit dem Ausdruck (der eine BRE ist) übereinstimmt, durch den Teil davon, der nach der Zeichenfolge auftrittprefix
.Beachten Sie, dass bei mehreren Instanzen von
prefix
in einer Zeile diesed
Variation die Zeichenfolge nach der letztengrep
zurückliefern würde , während die GNU- Variation die Zeichenfolge nach der ersten zurückliefern würde (die die anderen Instanzen von enthältprefix
).Die
sed
Lösung wäre portabel auf alle Unix-ähnlichen Systeme.quelle
Wie in den anderen Antworten angegeben,
grep
wird bei Lookbehinds keine Regex-Variante verwendet (standardmäßig mit GNUgrep
oder überhaupt nicht mit anderen Versionen).Wenn Sie feststellen, dass Sie GNU
grep
oder nicht verwenden könnenpcregrep
, können Sie es verwenden,perl
wenn Sie es haben.Das Kommandozeilenäquivalent zu
perl
wäre:Sie setzen die gewünschte Regex zwischen die Schrägstriche. Wenn Sie Perl verwenden, wird die reguläre Ausdrucksweise von Perl verwendet .
quelle
print "$&\n" if ...
wenn sie nur den Teil nach demprefix