Welche Zeichen in einem regulären Ausdruck müssen im Allgemeinen maskiert werden?
Beispielsweise ist Folgendes syntaktisch nicht korrekt:
echo '[]' | grep '[]'
grep: Unmatched [ or [^
Dies ist jedoch ist syntaktisch korrekt:
echo '[]' | grep '\[]'
[]
Gibt es eine Dokumentation darüber, welche Zeichen in einem regulären Ausdruck maskiert werden sollen und welche nicht?
quelle
bash
enthalten)!
wird die Erweiterung immer noch in doppelte Anführungszeichen gesetzt. Nur einfache Anführungszeichen stoppen die Erweiterung (oder deaktivieren die Shell-Option).]
sollte nicht immer zitiert werden[
. Ich fand keinen Hinweis auf{
und}
Es gibt mehrere Arten von regulären Ausdrücken, und die Anzahl der Sonderzeichen hängt vom jeweiligen Typ ab. Einige von ihnen werden im Folgenden beschrieben. In allen Fällen werden Sonderzeichen durch einen Backslash maskiert
\
. ZB passend[
schreiben Sie\[
stattdessen. Alternativ können die Zeichen (mit Ausnahme von^
) maskiert werden, indem sie nacheinander in eckige Klammern gesetzt werden[[]
.Die Zeichen, die in bestimmten Kontexten
^
speziell sind, z. B. am Anfang eines (Unter-) Ausdrucks, können in allen Kontexten maskiert werden.Wie schon andere geschrieben haben: Wenn Sie in der Shell den Ausdruck nicht in einfache Anführungszeichen setzen, müssen Sie zusätzlich die Sonderzeichen für die Shell in der bereits entkoppelten Regex entkoppeln. Beispiel: Anstatt
'\['
Sie können\\[
(alternativ:"\["
oder"\\["
) in Bourne-kompatiblen Shells wie Bash schreiben, aber dies ist eine andere Geschichte.Grundlegende reguläre Ausdrücke (BRE)
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
Erweiterte reguläre Ausdrücke (ERE)
grep -E
GNU :,sed -r
* BSD:sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
quelle
grep
verwendet BRE als reguläre Ausdrücke. Es gibt gute Dokumentation auf es hier , ein allgemeiner Überblick „keine Sonderzeichen oder metacharacter entkommen wörtlichen zu bekommen, entkommen Escape - Sequenzen zu erstellen (wäre\n
,\r
usw.)“, obwohl dies nicht immer der Fall ist, zum Beispiel, müssen Sie entkommen(
und)
ihre besondere Bedeutung bekommen (Rückverweis).quelle
Die Shell kann die Befehlszeile vor der Befehlsausführung transformieren. Sowohl die Shell als auch
grep
können Anführungszeichen verwenden, um die spezielle Bedeutung einiger Zeichen zu entfernen. Dennochgrep
und Muscheln haben unterschiedliche Sonderzeichen. Darüber hinaus werden nicht maskierte Sonderzeichen, die sich nicht aus einer vorhandenen Erweiterung ergeben haben, vor der Befehlsausführung von der Shell entfernt.Die Shell überträgt das Argument
[]
angrep
und es wird von als fehlerhafter Klammerausdruck analysiertgrep
.Oben sehen wir einen ähnlichen Fall. Der Backslash wird entfernt und
[]
als Argument an übergebengrep
.grep
Erkennt einen fehlerhaften Klammerausdruck.Schließlich werden in diesem Fall die Anführungszeichen von der Shell entfernt und
\[]
als Argument an übergebengrep
, in diesem speziellen Fall wird ¹\[
jedochgrep
als wörtliche Klammer interpretiert . Anführungszeichen sind erforderlich, um zu verhindern, dass der Backslash von der Shell als Sonderzeichen interpretiert wird.¹ POSIX-Spezifikation .
quelle