Einfache Bash und RegEx Fragen

8

Ich bin nicht in der Lage, ein Muster zu erhalten, um richtig mit regex in bash 4.1 zu entsprechen. Ich habe einige Informationen über Unterschiede in den Anführungsstrichen gelesen, die nicht zitiert werden, aber ich denke nicht, dass das mein Problem ist.

Mein Ziel ist es, zu überprüfen, ob das Skript eine gültige ID hat. Eine gültige ID ist in diesem Fall eine Zeichenfolge mit 9 Ziffern. Es ist mir klar, dass ein Regex-Ausdruck dafür \ d {9} ist. Angenommen, hier ist mein Code-Snippet zu überprüfen:

%Vor%

Rufen Sie das Skript dann mit:

auf %Vor%

Etwas offensichtlich, dass ich vermisse?

    
Gray Race 15.09.2011, 23:21
quelle

4 Antworten

8
  

Das wird funktionieren: wenn [[$ id = ~ [[: digit:]] {9}]] - David W. vor 11 Stunden

  

@David Ich habe das probiert und es schien nicht zu funktionieren. - Vivin Paliath vor 10 Stunden

Ich habe gerade ein Testprogramm geschrieben:

%Vor%

Und ich habe folgende Ausgabe:

%Vor%

Ich benutze BASH 3.2.48 für Mac OS X und Bash 4.1.10 (4) für Cygwin (Wow, die Mac-Version ist das alt?). Ich habe dies nicht auf einer Linux-Box getestet.

Welche Version verwenden Sie? Verdoppeln Sie die quadratischen Klammern um :digit: ? Es muss [[:digit:]] und nicht [:digit:] sein.

Ich habe auch festgestellt, dass ich die Anker ^ und $ brauche, weil Sie foo123456789bar oder 1234567890123456790 nicht anpassen wollen. War das ein Problem, das Sie hatten?

Die Sache ist, dass [[:digit:]] funktionieren sollte . Ich habe es in vielen Bash-Shell-Skripten verwendet und dachte, es sei ziemlich universell. Wenn Sie jedoch eine BASH-Shell haben, in der es nicht funktioniert, muss ich aufhören, es zu benutzen.

    
David W. 16.09.2011, 13:49
quelle
9

Da andere bereits geantwortet haben, sollten Sie [0-9]{9} verwenden, da \d nicht unterstützt wird. Aber ein anderer wichtiger Teil ist, Sie müssen Anker verwenden!

%Vor%

Der ^ verankert den Regex am Anfang des Strings und der $ verankert ihn am Ende. Wenn Sie sie nicht verwenden, wird Ihr Regex auf jeden String passen, der 9 Ziffern in einer Sequenz enthält, wie "abc123456789", "asdf123456789zui" oder "123456789FOOBAR".

    
stema 16.09.2011 05:49
quelle
3

Versuchen Sie Folgendes:

%Vor%

Es sieht so aus, als ob bash \d nicht als [0-9] erkennt.

Bash verwendet die Erweiterter Dialekt für reguläre Ausdrücke , der \d nicht unterstützt.

Gemäß der ERE-Grammatik (lexikalische Konventionen) haben maskierte Zeichen die Form \SPEC_CHAR . SPEC_CHAR kann eine der folgenden sein:

%Vor%     
Vivin Paliath 15.09.2011 23:32
quelle
-1

Das Problem ist, dass \ d vor der Interpretation in d umgewandelt wird. Versuchen Sie doppelt zu entkommen.

%Vor%

Alternativ könnten Sie es in Anführungszeichen setzen

%Vor%     
Asmor 15.09.2011 23:56
quelle

Tags und Links