Können Sie mit diesem regulären Ausdruck in meinem sourceslist.nanorc
helfen?
Regex:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Fehler:
Bad regex "cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/": Invalid range end
Vielen Dank.
Kommentare
- Vielleicht sollten Sie dem Bindestrich entkommen (
-
): Dies kann als Bereich interpretiert werden …
Antwort
Das Problem ist wahrscheinlich die Platzierung des -
-Zeichens in Ihrer Zeichenliste.
Sie haben bereits die Tatsache verwendet, dass Zeichenbereiche durch [start-end]
ausgedrückt werden können, wie in [a-z]
als Abkürzung für [abcdefghijkl...xyz]
(siehe jedoch die Einschränkung unten). Dies bedeutet, dass das -
ein Sonderzeichen ist und wenn es zwischen zwei " regulären " Zeichen, es wird so interpretiert, dass es einen weiteren Bereich angibt, der diese beiden Zeichen und jedes dazwischen umfasst.
Dies funktioniert natürlich nur, wenn das Zeichen nach -
ist lexikographisch " später " in der Sortierreihenfolge und dann das Zeichen davor, was auch der Grund für Ihre Fehlermeldung ist (Sie wird sehen, dass es verschwindet, wenn Sie stattdessen (-_
sagen, obwohl das Ihr Problem nicht lösen wird ).
Da Sie offensichtlich wollen Um mit dem Literal -
und übereinzustimmen, müssen Sie entweder je nachdem, wie reguläre Ausdrücke in .nanorc
interpretiert werden / p>
- muss entkommen (dh
\-
) oder - muss es zuerst oder zuletzt im Zeichen platzieren Liste (d.h.
[-etc]
oder[etc-]
), die in regulären POSIX- und GNU-Ausdrücken Standard wären und daher Die wahrscheinlichste Lösung auf einem Linux-System .
Siehe z hier als weitere Referenz.
Vorsichtsmaßnahme : Die Anweisung über " [a-z]
als Abkürzung für [abcdefghijkl...xyz]
lautet nicht unbedingt wahr ! Wie der Bereich interpretiert wird, hängt von den Gebietsschemaeinstellungen ab, insbesondere von der Sortierreihenfolge.
- Im " C " Gebietsschema, die Reihenfolge entspricht dem ASCII-Codewert, dh
ABC...XYZ...abc...xyz
. Hier bedeutet[a-z]
tatsächlich " alle Kleinbuchstaben ". - In den meisten anderen Ländereinstellungen werden Groß- und Kleinbuchstaben zusammengefasst, dh die Reihenfolge lautet
aAbBcC...xXyYzZ
. Hier würde[a-z]
" alle Kleinbuchstaben und alle Großbuchstaben außerZ
bedeuten. - Die Behandlung von Nicht-ASCII-Zeichen wie " Umlaute " ist ein weiteres Problem.
Weitere Diskussionen zu diesem Thema finden Sie unter hier und hier .
Antwort
Einfügen unter https://regexr.com/ hilft beim Debuggen besser.
Sie haben -
im Bereich nicht als -
entkommen wird verwendet, um den Bereich anzugeben.
Alt:
cdrom:\[[a-zA-Z0-9\._-\(\) ]+\]/
Korrektur:
cdrom:\[[a-zA-Z0-9\._\-\(\) ]+\]/
Kommentare
- Vielen Dank für den Link
- Es würde nicht helfen, einen Bindestrich in Klammern zu entfernen. Beachten Sie, dass Backslashes für den Ausdruck in
[...]
keine besondere Bedeutung haben. Dies bedeutet auch, dass[\.]
einem Punkt oder einem Backslash entspricht. - Wirklich? Ich bezweifle. Um den Schrägstrich abzugleichen, müssen Sie ihn zweimal maskieren \\, um ihn abzugleichen.
- @JamesJohn Versuchen Sie z.
grep '[\]' <<<'\'
odergrep -o '[\.]' <<<'123\.abc'
- Fügen Sie das Problem in grep ein und sehen Sie den Fehler. Wenden Sie dann meinen Fix an, um ihn zu beheben