2011-01-28 57 views
1

我想分割線,例如:正則表達式來拆分名=值,*爲名字,*和值的CSV,*

name1=value1,name2=value2, .....,namen=valuen 

2產生兩行如下:

name1,name2, .....,namen 
value1,value2, .....,valuen 

其目標是沿線的構造SQL INSERT:

input="name1=value1,name2=value2, .....,namen=valuen" 
namescsv=$(echo $input | sed 's/=[^,]*//g') 
valuescsv=$(echo $input | ??????) 

INSERT INTO table_name ($namescsv) VALUES ($valuescsv) 

我還想這樣做盡可能簡單 - perl的awk的,或多個管道,以削減TR等等似乎太複雜了。鑑於名稱部分似乎很簡單,我認爲這些值必須有類似的值,但無法解決。

回答

3

你可以只反你的性格匹配:

echo $input | sed 's/[^,]*=//g' 
+0

+1我只是寫同樣的... – 2011-01-28 15:10:32

0

我認爲你最好的選擇仍然是sed -re s/[^=,]*=([^,]*)/\1/g,但我猜輸入的數據可能與你的表完全一致。

+0

你能澄清爲什麼會更好嗎?我的正則表達式的眼睛是平庸的 – hanlonj 2011-01-28 15:20:02

+0

啊不,上面的一樣好,雖然也許不那麼嚴謹。 – 2011-01-28 16:21:13

0

注意,在一些RDBMS,你可以使用下面的語法:

INSERT INTO table_name SET name=value, name2=value2, ...; 

http://dev.mysql.com/doc/refman/5.5/en/insert.html

下面的腳本做什麼你正在請求並處理轉義(不僅僅是因爲注入,而且您可能希望在其中插入帶引號的值):

_IFS="$IFS"; IFS="," 
line="name1=value1,name2=value2,namen=valuen"; 

for pair in $line; do 
     names="$names,${pair%=*}" 
     values="$values,'$(escape_sql "${pair#*=}")'" 
done 
IFS="$_IFS" 

echo "INSERT INTO table_name (${names#,}) VALUES (${values#,})" 

輸出:

INSERT INTO table_name (name1,name2,namen) VALUES ('value1','value2','valuen')