首页 > 解决方案 > 如何在 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 周围加上单引号???

标签: sqlbashshellfilescripting

解决方案


由于您正在通过一系列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

……这由你决定。


推荐阅读