Übereinstimmende Sonderzeichen mit regulären Ausdrücken

10

Angenommen, es ist sehr einfach, wenn ich etwas finden möchte, das Kleinbuchstaben und Zahlen enthält

produzieren_text | grep -E '[0-9a-z]'

Klammern sind nützlich, um mit einer Reihe von Zeichen übereinzustimmen, aber was ist mit denen, die etwas Besonderes sind?
Wenn ich in Klammern ein beliebiges Zeichen außer einem dieser Zeichen verwenden möchte : eine schließende Klammer ], ein Bindestrich (oder Bindestrich) "-", beide Schrägstriche /und \, ein Caret ^, ein Doppelpunkt :.
Wird es so aussehen (ich weiß, dass das nicht funktioniert)?

[^] - / \ ^:]
iBug
quelle

Antworten:

11

Um ein Literal ]und ein Literal -in einem Klammerausdruck abzugleichen, müssen Sie sie wie folgt verwenden:

[^]/\^:-]

oder noch besser, da bei einigen Tools der Backslash maskiert werden muss :

[^]/\\^:-]

Das heißt,
die rechte eckige Klammer (']') verliert ihre besondere Bedeutung und stellt sich in einem Klammerausdruck dar, wenn sie zuerst in der Liste vorkommt (nach einem anfänglichen '^', falls vorhanden),
und
das Bindestrich-Minus-Zeichen muss wird als selbst behandelt , wenn es zuerst (nach einem anfänglichen ‚^‘, falls vorhanden) oder den letzten in der Liste auftritt
, damit
wenn eine Klammer Ausdruck gibt sowohl ‚-‘ und ‚]‘, die ‚]‘ wird zuerst angeordnet werden (nachdem die '^', falls vorhanden) und das '-' als letztes innerhalb des Klammerausdrucks.
Die Regeln für Klammerausdrücke sind für ERE und BRE gleich .

don_crissti
quelle
2
Ich würde den Backslash verdoppeln, um auf der sicheren Seite zu sein. Es wird bei vielen awkImplementierungen und perlzum Beispiel benötigt.
Stéphane Chazelas
Was ist mit "Vom Caret zur schließenden Klammer"? Wie [^-]](Dieser schlägt fehl)?
iBug
2
@iBug - sicher, dass es fehlschlägt, da die rechte Klammer an erster Stelle stehen muss, wenn Sie sie buchstäblich anpassen möchten. Ich bin mir nicht sicher, ob ich den Punkt dieses "Bereichs" verstehe, den Sie so erwähnen, wie er später ^ist. ]Dies [^-]]würde nicht funktionieren, selbst wenn beide ^und ]buchstäblich behandelt würden (genau wie [b-a]). Wenn Sie von z. B. ;zu schließender Klammer passen möchten, können Sie einen Bereich bis zum Zeichen vor ](was ein Backslash ist) verwenden und ]als erstes Zeichen in den Klammerausdruck aufnehmen, z [];-\\].
don_crissti
@don_crissti Was ist mit [[.^.]-[.-.]]? Ich habe das Gefühl, dass dies funktionieren würde. Nehmen wir an, dass der ASCII-Code von ^vorher ist -.
iBug
Ich habe eine faule Lösung für meine Frage. [^[.].][.-.]/\^:]
Holen Sie sich
7

Seltsamerweise müssen Sie vielleicht ein paar Charaktere an bestimmten Orten haben. Sie müssen ]das erste Zeichen in einem Satz und -das letzte Zeichen in einem Satz sein.

Hier ist ein RE , die Ihre Anforderungen erfüllt: [^]\^/-]:

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4
Roaima
quelle
1
Es ist nicht wirklich seltsam, es ist nur notwendig, um Mehrdeutigkeiten zu vermeiden
Kevin
1
Das zweite [Zeichen gehört nicht dorthin; das OP will es nicht ausschließen.
Scott
@ Scott gut entdeckt, danke. Antwort aktualisiert.
Roaima