2016-05-08 19 views
0

Ich schreibe ein Skript und ich möchte eine Variable für ein Format überprüfen. Dies ist die Funktion, die ich verwenden:Bash regulären Ausdruck mit Anführungszeichen

check_non_numeric() { 
    #re='^\".*\"$' 
    re='\[^\]*\' 
    if ! [[ $1 =~ $re ]] ; then 
     echo "'$1' is not a valid format - \"[name]\" " 
     exit 1 
    fi 
} 

ich den regulären Ausdruck wollen aber Anführungszeichen eine Zeichenfolge mit etwas übereinstimmen innen und Anführungszeichen um es („a“ oder „string“ oder „dsfo^$ **! # "). Das Problem ist, dass diese regulären Ausdrücke, die ich mir ausgedacht habe, nicht für mich funktionieren. Ich habe eine sehr ähnliche Funktion verwendet, um zu überprüfen, ob eine Variable eine Ganzzahl oder ein Gleitkomma ist und dort funktioniert. Könnten Sie mir bitte sagen, was der fragliche reguläre Ausdruck sein sollte?

Vielen Dank

+0

Versuchen Sie 're ='^[^ "] * $ '' –

+0

das akzeptiert alles –

+0

Ich bin verwirrt über das, was Sie wollen.Wollen Sie Zitate um die Zeichenfolge, aber nicht drin? Oder wollen Sie keine Anführungszeichen an alle? – Galik

Antwort

1

Ich nehme an, Sie meinten, Sie wollen alles, was keine Zeichenfolge ist umgeben von Anführungszeichen übereinstimmen. Es ist einfacher, den regulären Ausdruck zu verwenden, um ihn zu finden, und der bash-test, um ihn "nicht" zu finden - wenn das nicht klar ist, benutze !. Hier sind ein paar Möglichkeiten, dies zu tun.

if [[ ! $(expr "$string" : '\".*\"') -gt 0 ]]; then echo "expr good"; fi

if [[ ! "$string" =~ \".*\" ]]; then echo "test good"; fi

Stellen Sie sicher, geben Sie Ihre Variable, die Sie mit ausdr Prüfung werden (die nur zur Erbauung Zwecke gibt es).

+0

funktioniert, danke! –

1

Wie Sie alles passen mit Anführungszeichen außer Zeichenfolge wollen, zielen Sie nur die Anführungszeichen:

re='["]' 
if [[ ! $1 =~ $re ]] ; then 

Eigentlich brauchen Sie nicht Regex für diese. Globbing wird genug sein:

+0

leider funktioniert nicht :( –

+0

Ich weiß vielleicht warum - ich bekomme den Namen mit "während getopts" Schleife und ich benutze es wie "check_non_numeric" $ OPTARG ", aber wenn ich versuche, es in der Funktion zu wiederholen, wird es ohne sie angezeigt - ich werde versuchen, zu finden, wie man sie in Variablen –

0

Ihre Regex ist sehr, sehr weit weg. \[ entspricht einer wörtlichen linken eckigen Klammer und ^ (außerhalb einer Zeichenklasse) entspricht Zeilenanfang.

Etwas wie '^"[^"]*"' sollte funktionieren, wenn das wirklich das ist, was Sie wollen.

Allerdings bezweifle ich das. Um einen Wert in wörtliche doppelte Anführungszeichen passieren, würden Sie so etwas wie

yourprogram '"value"' 

oder

yourprogram "\"value\"" 

brauchen, die ich auf jeden Fall vermeiden möchte, wenn ich du wäre.

+0

Er würde' yourprogram 'nicht brauchen " Wert "'' wenn er die Zeichenfolge nicht als Argument an das Skript weitergibt, sondern als Zeile aus einer Datei liest - was ich fast sicher bin der Fall. – SaintHax