"Klammern nicht ausgeglichen", obwohl ich entkommen bin?

10

Ich versuche, diesen einfachen sedBefehl auszuführen

sed '/VALUES\ \([0-9]/d!'

Es gibt mir immer noch einen Fehler zu sagen "RE error: parentheses not balanced"(ja, die Zitate sind da).

Was kann ich machen? Ich meine, ich könnte einfach eine weitere hinzufügen, )aber sie würde nicht zu meiner Regex passen.

Anzeigename
quelle
Hast du vielleicht das 's' in 's / VALUES ...' vergessen?
Minix
Nein, ich ersetze nicht die Suche.
DisplayName
@Minix, er versucht nicht, einen String zu ersetzen, sed macht viel mehr als das. sed /<expression>/dlöscht die Zeilen mit <Ausdruck>
Marcelo
@ Marcelo Ja. Sah das beim Betrachten der Manpage. War nur ein Schuss in die Dunkelheit. Scheint, als hätte ich Nebenliteratur.
Minix
@DisplayName Fügen Sie -rIhrem sed-Befehl einfach eine Option hinzu und verschieben Sie die !Vorderseite von dlike sed -r '/VALUES\ \([0-9]/!d', um dies zu vermeiden.
αғsнιη

Antworten:

13

Das Escape (hat eine besondere Bedeutung in sed: Es wird für Rückverweise verwendet . Um ein Literal zu finden (, verwenden Sie es einfach ohne Backslash:/VALUES ([0-9]/d!

Wenn Sie versuchen, eine Übereinstimmung zu erzielen \(, entkommen Sie \stattdessen dem:\\(

Das Entkommen aus dem (Leerzeichen) macht keinen Unterschied.

muru
quelle
5

sedVerwenden Sie standardmäßig Basic Regular Expression (BRE) . In BRE \(und \)werden zum Definieren des Unterausdrucks verwendet :

Ein Unterausdruck kann innerhalb einer BRE definiert werden, indem er zwischen die Zeichenpaare "(" und ")" eingeschlossen wird. Ein solcher Unterausdruck muss mit dem übereinstimmen, was ohne "(" und ")" übereinstimmen würde, mit der Ausnahme, dass die Verankerung in Unterausdrücken optional ist. Siehe BRE-Ausdrucksverankerung. Unterausdrücke können beliebig verschachtelt werden.

Dann können Sie Rückverweis Ausdruck verwenden '\n'die gleiche (möglicherweise leere) Zeichenfolge übereinstimmen , wie durch einen subexpression abgestimmt wurde eingeschlossen zwischen \(und \), wo naus 1durch 9. Hier verwenden Sie nur linke Klammern \(, sedkönnen keine rechten Klammern finden und einen Fehler auslösen.

In BRE (stimmen Sie nur mit wörtlichen linken Klammern überein.

In einigen sedImplementierungen können Sie zu Extended Regular Expressions (ERE) wechseln (Beispiel GNU sed with -ropstion), sodass Sie \(literale linke Klammern verwenden müssen.

cuonglm
quelle
0

Das ist genau der Grund. In diesem Fall sollten Sie sich der Klammer nicht entziehen.

Einfache Anführungszeichen 'weisen die Shell bereits an, sich nicht um den Inhalt der Zeichenfolge zu kümmern, sodass sie buchstäblich an sed übergeben wird. Wenn Sie der Klammer entkommen, müssen Sie das Ende \)als Trennzeichen für einen Sub-Regex erwarten .

Marcelo
quelle