2017-02-23 2 views
0

Ich habe ein Bash-Skript, das ich versuche zu lernen. Ich habe eine SQL-Datei, die in sich hat:Erhalten Wert von Zeichenfolge basierend auf RegEx

create user myuser with password 'mypassword'; 

Ich möchte sed verwenden und den Wert des Passworts in einer Bash-Variablen und der pasword in anderen bash Variablen. Das Skript, von dem ich lerne, hat:

USERNAME := $(shell sed -n \ 
"s/^create user \(\S\+\) with password '\(\S\+\)';$$/\1/p" \ 
createdb.sql) 
PASSWORD := $(shell sed -n \ 
"s/^create user \(\S\+\) with password '\(\S\+\)';$$/\2/p" \ 
createdb.sql) 

Egal was ich versuchte, die Regex würde nicht zusammenpassen. Teil meines Problems ist, dass ich die Grundlagen von sed nicht verstehe. Wie gehe ich vor, um den Wert von Teilen der Zeichenfolge zu erhalten?

Antwort

2

Verwenden Sie nicht sed dafür; Verwenden Sie die integrierte Unterstützung für reguläre Ausdrücke von bash.

str="create user myuser with password 'mypassword';" 
regex='create user (.*) with password (.*);' 
if [[ $str =~ $regex ]]; then 
    username=${BASH_REMATCH[1]} 
    password=${BASH_REMATCH[2]} 
fi 

Was, wie Sie die entsprechende Zeile in erster Linie erhalten , verwenden grep:

str=$(grep "create user" createddb.sql) 
+0

$ str in diesem Fall würde die Datei sein? –

+1

hm ... mit externen 'grep' und nach bash builtin regex, anstatt einer externen sed + lesen? – jm666

+0

Sie könnten, aber ich finde das ein wenig einfacher. Es verwendet im Wesentlichen ein Trennzeichen mit mehreren Zeichen "with password", um die beiden Werte zu trennen, anstatt zu versuchen, ein sicheres Ein-Zeichen-Trennzeichen zu erzeugen, das in 'IFS' verwendet werden kann, um die Ausgabe von' sed' lesen zu lassen. – chepner

Verwandte Themen