2017-02-23 47 views
0

我有一個bash腳本,我試圖從中學習。我有中有一個SQL文件:根據RegEx獲得字符串值

create user myuser with password 'mypassword'; 

我想用sed和存儲在一個慶典變量的密碼和其他的bash變量pasword的價值。我正在學習的腳本有:

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內建正則表達式,而不是一個外部sed +讀? – jm666

+0

你可以,但我覺得這有點簡單。它主要使用一個帶有密碼的多字符分隔符來分隔這兩個值,而不是試圖想出一個安全的單字符分隔符來在'IFS'中使''read' resplit'sed'的輸出。 – chepner