Ich versuche, diesen einfachen sed
Befehl 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.
text-processing
sed
regular-expression
Anzeigename
quelle
quelle
sed /<expression>/d
löscht die Zeilen mit <Ausdruck>-r
Ihrem sed-Befehl einfach eine Option hinzu und verschieben Sie die!
Vorderseite vond
likesed -r '/VALUES\ \([0-9]/!d'
, um dies zu vermeiden.Antworten:
Das Escape
(
hat eine besondere Bedeutung insed
: 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.
quelle
sed
Verwenden Sie standardmäßig Basic Regular Expression (BRE) . In BRE\(
und\)
werden zum Definieren des Unterausdrucks verwendet :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\)
, won
aus1
durch9
. Hier verwenden Sie nur linke Klammern\(
,sed
können keine rechten Klammern finden und einen Fehler auslösen.In BRE
(
stimmen Sie nur mit wörtlichen linken Klammern überein.In einigen
sed
Implementierungen können Sie zu Extended Regular Expressions (ERE) wechseln (Beispiel GNU sed with-r
opstion), sodass Sie\(
literale linke Klammern verwenden müssen.quelle
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 .quelle