2017-02-23 11 views
0

私は勉強しようとしているbashスクリプトを持っています。正規表現に基づいて文字列から値を取得

create user myuser with password 'mypassword'; 

私はsedを使用し、1つのbashの変数と別のbashの変数にpaswordにパスワードの値を格納したい:私はそれで持っているSQLファイルを持っています。私が学んでいるスクリプトには:

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) 

正規表現を試しても問題はありません。私の問題の一部は、私はsedの基礎を理解していないということです。文字列の一部の値を取得するにはどうすればよいですか?

答えて

2

これにはsedを使用しないでください。 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 

あなたは最初の場所で適切な行を取得方法については、grep使用:

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

$ strを、この場合のファイルでしょうか? –

+1

hm ...外部の 'grep'とbash組み込み正規表現の後に、1つの外部sed +読み込みの代わりに? – jm666

+0

あなたはそうかもしれませんが、これは少し簡単です。 'sed'の出力を'読み込み 'するために' IFS'で使う安全な1文字の区切り文字を出そうとするのではなく、複数の文字区切り文字 'パスワード付き'を使って2つの値を区切ります。 – chepner

関連する問題