【问题标题】:How to remove the single quotes around a String in Bash script?如何在 Bash 脚本中删除字符串周围的单引号?
【发布时间】:2020-02-08 04:25:33
【问题描述】:

我编写了一个 shell 脚本 (.sh) 文件,它将 SQL 查询的结果存储到一个文件中。

SQL 文件的结果需要批量转换为 INSERT 查询。

SQL 查询中有三列,使用以下命令将它们写入文件

mysql -u$db_user -p -h 127.0.0.1 -P 3308 < my_query.sql > my_results_into_file

现在我对文件my_results_into_file进行一些操作

sed -i.bak -e $'s/\t/\x27,\x27/g' my_results_into_file # replace tabs in output with commas, add single quotes around values
sed -i.bak -e '1d' my_results_into_file # remove first line from the file (column names)
sed -i.bak -e $'s/^/INSERT INTO mytable(column1, column2, column3) VALUES(\x27/' my_results_into_file # build inserts
sed -i.bak -e $'s/$/\x27);/' my_results_into_file # build inserts

上面的脚本会导致一个问题,因为Query中有一个NULLABLE列,它可以包含NULL,这将使NULL值被单引号括起来,被视为'NULL'并且是一个字符串。

有没有一种方法可以在其中一个脚本中避免在 NULL 周围加上单引号???

【问题讨论】:

    标签: sql bash shell file scripting


    【解决方案1】:

    由于您通过一系列 sed 命令运行数据,我认为最简单的解决方案将是另外一个 sed,例如:

    $ echo "insert into mytable values ('a',123,'NULL');" | sed "s/'NULL'/NULL/g"
    insert into mytable values ('a',123,NULL);
    

    现在,无论您是否将其作为另一个独立的 sed 调用,例如:

    $ sed -i.bak -e $"s/'NULL'/NULL/g" my_reulsts_into_file
    

    或者将您的第一个 sed 调用转换为多模式 sed 调用,例如:

    $ sed -i.bak -e $"s/\t/\x27,\x27/g; s/'NULL'/NULL/g" my_results_into_file
    

    ...由您决定。

    【讨论】:

    • 好东西。另请注意,当前代码的每次迭代都会清除“原始”文件,一旦调用第二个sed,就会使用-i.bak 保存。再见,原始文件 ;-) 您也可以将所有 cmds 放在一个文件中,并像 sed -i.bak -f mySedScript DataFile 一样调用它。祝大家好运。
    • @shellter - 同意;不幸的是,OP 似乎有不提供任何反馈的历史,所以不确定这些响应(答案/cmets)中有多少通过了......
    • 我想避免在列的 NULL 值周围添加单引号。上面的解决方案说要去掉 NULL 周围的单引号。有没有办法避免在 NULL 周围添加单引号?其背后的原因是,如果 SQL 查询的输出中存在值为“NULL”的字符串,则此解决方案将剥离 '' 并将其视为 NULL,我不想这样做。
    • 从所发布的内容(到目前为止)尚不清楚您如何知道应该引用哪些 NULL 值;这将归结为您的 SQL 如何生成/显示'NULL' vs NULL;换句话说,我们不知道来自 SQL 查询的原始数据是什么样的:'NULL'NULL
    猜你喜欢
    • 2021-09-19
    • 2019-06-27
    • 1970-01-01
    • 2018-10-29
    • 2020-06-10
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多