sql - 如何在 Bash 脚本中删除字符串周围的单引号?
问题描述
我编写了一个 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
上面的脚本会导致一个问题,因为查询中有一个 NULLABLE 列,它可以包含 NULL,这将使 NULL 值被单引号括起来,并被视为“NULL”并且是一个字符串。
有没有一种方法可以在其中一个脚本中避免在 NULL 周围加上单引号???
解决方案
由于您正在通过一系列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
……这由你决定。
推荐阅读
- firebase - 如何将firebase项目的身份验证用于其他项目的firestore?
- python - 我该如何解决这个 python 问题?[django]
- python-3.x - 如何检查 Python 程序在运行时使用了多少内存
- javascript - 使用百分比查找范围内的值
- java - 如何将对象从活动发送到片段?
- java - Java 执行器服务:等待所有任务完成
- android - 连接到服务器的蚂蚁媒体 webrtc 给出 java.security.cert.CertPathValidatorException
- python - 如何在不导入主文件的情况下从另一个文件调用函数?
- javascript - 带有 GatsbyJS 的 Netlify 表单跳过输入字段之一
- typescript - 无法使 TypeScript 泛型链工作