Grep ist "Invalid range end" — bug oder feature?
Ich habe diese drei Dateien:
$ cat pattern-ok
['\-]
$ cat pattern-buggy
[\-']
$ cat text
abc'def-ghi
Und jetzt ist Folgendes ein bug oder eine regexp-Funktion, die ich nicht kenne?
$ cat text | grep -f pattern-ok
abc'def-ghi
$ cat text | grep -f pattern-buggy
grep: Invalid range end
Ich bin mit:
$ grep --version | head -n 1
grep (GNU grep) 2.20
- Gefunden über Google, sich manchmal dieser Fehler ist unerwartet, verursacht durch einen glibc-bug. bugzilla.redhat.com/show_bug.cgi?id=583011
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist weil Sie mit dem Bindestrich in anderen Zeichen, so dass
grep
versteht Sie als ein Bereich,, die passiert werden ungültig.Sind Sie im Grunde tun
Interpretiert wird dieses durch
grep
wie Sie die Bereitstellung einer Reihe von Zeichen überprüft werden, wie zum Beispielgrep "[a-z]" file
. Aber die Auswahl von\
zu'
ist ungültig, daher der Fehler.Ist und warum der andere arbeitet? Sie Fragen sich vielleicht. Weil das, was Sie tun, ist:
In diesem Fall sind Sie auf der Suche für entweder den Charakter
'
,\
oder-
in der Datei.Finden Sie ein weiteres Beispiel, wo ich will, zu finden, Zeichen
a
,-
oder3
in einer angegebenen Zeichenfolge:Also das zugrunde liegende problem ist, dass Sie mit einem Ausdruck
some character
+-
+another character
innerhalb einer[]
block und versucht es zu Lesen, da der Bereich der Zeichen zwischensome character
undanother character
.Wie kann man es lösen?
Wenn Sie angeben möchten, dass der Charakter
-
unter anderem, fügen Sie es einfach in die Kanten der Ausdruck: als die ersten oder letzten Element.Vom
man grep
:-
behandelt werden wie ein normaler Charakter? Setzt es am Ende[]
Gruppe die einzige Möglichkeit?-
in der Vorder-oder der Rückseite des Ausdrucks, so dass es nicht behandelt werden wie eine Reihe.[]
Gruppe? :O Ziemlich seltsam. Mein ganzes Leben habe ich mit es wie[abc\-def]
und nicht wissen, die wahre Bedeutung. Danke.man grep
wo es genau besagt dieses.a-z
ist OK, denn a ist kleiner als z, ASCII-Weise.Vermeiden range-Wert können Sie
fgrep
.