регулярное выражение для разделения name = value * на csv имени * и значения * - PullRequest
1 голос
/ 28 января 2011

Я хотел бы разбить строку, например:

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

две производят две строки следующим образом:

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

цель состоит в том, чтобы создать вставку SQL в соответствии с:

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 cut и т. Д. Кажется слишком сложным. Учитывая, что часть имен кажется достаточно простой, я считаю, что должно быть что-то похожее для значений, но я не могу решить это.

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Вы можете просто инвертировать совпадение вашего персонажа:

echo $input | sed 's/[^,]*=//g'
0 голосов
/ 28 января 2011

Обратите внимание, что в некоторых СУБД вы можете использовать следующий синтаксис:

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' )
0 голосов
/ 28 января 2011

Я думаю, что ваша лучшая ставка по-прежнему sed -re s/[^=,]*=([^,]*)/\1/g, хотя я думаю, что входные данные точно соответствуют вашей таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...