2016-11-02 3 views
0

Ich versuche, um REGEX in bash zu verwenden, um zu überprüfen, ob die Parameter einen gültigen Pfad folgen dieses Format zu sein scheinen:Bash if-Anweisung mit regex

/first/second 

in Java I mit Erfolg verwenden Sie die folgende REGEX:

((\\/)[a-zA-Z0-9\\[email protected]\\-!#$%&+=]+)+ 

Aber in Bash habe ich ein Problem, das ich nicht erklären kann. Um mein Verständnis zu vereinfachen, ich versuche, eine einfachere REGEX so zu verwenden:

CHECKPATH="!/first/second" 
REGEX_PATH="((\/)[a-zA-Z0-9]+)+" 
if [[ ! ${CHECKPATH} =~ $REGEX_PATH ]]; then 
    echo "error" 
else 
    echo "OK" 
fi 

ich einfügen ein „!“ auf dem Weg nur zu überprüfen. Also sollte ich "Fehler" haben aber nicht. Mit oder ohne "!" Es ändert nichts, was ist das Problem?

Update: (bewegt Autors Teilfrage hier aus einem Kommentar)

Eine weitere Sache, wenn ich ^((\/)[a-zA-Z0-9\[email protected]#&%!$+=\-]+)+$ verwenden Es ist in Ordnung, aber es ist nicht mit ^((\/)[a-zA-Z0-9\[email protected]\-#&%!$+=]+)+$. Ich habe gerade die Position von "\ -" in der Regex geändert, warum?

+1

Sie müssen möglicherweise^und $ hinzufügen für beginnt mit und endet mit. Versuchen Sie es hier zu testen: http://www.regexpal.com/ – Buzz

+0

Funktioniert für mich in 'bash' 3.2 und und 4.3, mit oder mit dem'! 'im Wert von' CHECKPATH'. – chepner

Antwort

2

Einige Regex-Bibliotheken (möglicherweise die von Ihnen verwendete Java-Bibliothek) verfügen über Methoden, die die Regex speziell für die gesamte Eingabezeichenfolge testen.

Aber in bash (und in der Regel in regex) Sie verwenden:

  • ^ - Spiel Beginn der Eingabe und
  • $ - entspricht Ende des Eingangs

Statt versuchen ,

REGEX_PATH="^((\/)[a-zA-Z0-9]+)+$" 

Update:

Sie müssen den Strich am Anfang/Ende setzen.

http://man7.org/linux/man-pages/man7/regex.7.html:

Um eine wörtliche zu umfassen ‚-‘, machen es die erste oder letzte Zeichen, oder der zweite Endpunkt eines Bereichs. Um ein Literal "-" als ersten Endpunkt eines Bereichs zu verwenden, schließen Sie es in "[." und ".]", um es zu einem zusammenfassenden Element zu machen (siehe unten).

UND (gleicher Link) [Hervorhebung von mir]

Mit Ausnahme von diesen und einigen Kombinationen mit '[', alle anderen Sonderzeichen, einschließlich '\' (nächste Absätze sehen), verlieren ihre besondere Bedeutung innerhalb einer Klammer Ausdruck.

+0

ok danke,^und $ hat mein Problem gelöst! – gduh

+0

Noch eine Sache, wenn ich^((\ /) [a-zA-Z0-9 \ s _ @ # &%! $ + = \ -] +) + $ benutze es ist ok, aber es ist nicht mit^((\ /) [a-zA-Z0-9 \ s _ @ \ - # &%! $ + =] +) + $.Ich ändere einfach die Position von "\ -" in der Regex, warum? – gduh

+0

@gduh Ich habe diese Teilfrage zu der ursprünglichen Frage verschoben und meiner Antwort ein Update hinzugefügt. –