开发者

regex to split name=value,* into csv of name,* and value,*

开发者 https://www.devze.com 2023-02-07 01:57 出处:网络
I would like to split a line such as: name1=value1,name2=value2, .....,namen=valuen two produce two lines as follows:

I would like to split a line such as:

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

two produce two lines as follows:

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

the goal being to construct an sql insert along the lines of:

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

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

Id like to do this as simply as possible - perl awk, or multiple piping to tr cut etc seems too complicated. Given the name开发者_开发百科s part seems simple enough I figure there must be something similar for values but cant work it out.


You can just inverse your character match :

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


i think your best bet is still sed -re s/[^=,]*=([^,]*)/\1/g though I guess the input would have match your table exactly.


Note that in some RDBMS you can use the following syntax:

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

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

The following shell script does what you are asking for and takes care of escaping (not only because of injection, but you may want to insert values with quotes in them):

_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#,} )"

Output:

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

精彩评论

暂无评论...
验证码 换一张
取 消