【问题标题】:regex to split name=value,* into csv of name,* and value,*正则表达式将 name=value,* 拆分为 name,* 和 value,* 的 csv
【发布时间】:2011-06-17 07:23:59
【问题描述】:

我想分割一行如:

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 等似乎太复杂了。鉴于名称部分似乎很简单,我认为值必须有类似的东西,但无法解决。

【问题讨论】:

    标签: sql regex string sed awk


    【解决方案1】:

    你可以反转你的角色匹配:

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

    【讨论】:

    • 太棒了。我正在尝试 $input | sed 's/,[^=]*//g' ,新的它必须接近。知道我应该在几年前就注册这个网站
    【解决方案2】:

    我认为您最好的选择仍然是sed -re s/[^=,]*=([^,]*)/\1/g,尽管我猜输入会与您的表格完全匹配。

    【讨论】:

    • 你能解释一下为什么这会更好吗?我的正则表达式眼睛很平庸
    • 啊,不,上面的一样好,虽然可能不那么严格。
    【解决方案3】:

    请注意,在某些 RDBMS 中,您可以使用以下语法:

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

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

    以下 shell 脚本执行您的要求并负责转义(不仅因为注入,而且您可能希望在其中插入带引号的值):

    _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' )
    

    【讨论】:

    • 谢谢,很高兴知道。但是,我为此使用的 sqlite3 似乎并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多