test.json是一个多行的json,需要插入表a的value字段中,表a的建表语句如下:

create table a(
  id int AUTO_INCREMENT,
  value text,
  PRIMARY KEY (`id`)
);

操作流程

str=$(cat test.json)
str2=$(perl -pe 's/"|\047|\134/\134$&/g' <<< "$str")
mysql -uuser -p -hhost -Pport -Ddb -e 'insert into a(value) values("'"$str2"'");'

解释:

str2是利用perl将文本进行转义,转义三个字符单引号(')、双引号(")、反斜杠(\\),\047表示单引号,\134表示反斜杠,因为最外层用了单引号,所以这两个字符直接使用8进制数表示,否则无法转义。

mysql -e执行插入命令,注意"'"$str2"'",第一个"为sql语句中字符串值的开始引号,接着的'表示闭合shell的字符串,对应的开始引号在insert前面。紧接着"$str2"表示用shell解释变量str2,并保留变量中的所有格式和空白,下一个'表示shell字符串开始,然后"表示sql语句中字符串值的闭合引号。

str2变量也可以直接采用如下方式得到:

str2=$(perl -pe 's/"|\047|\134/\134$&/g' <(cat test.json))

解释:利用进程代换(Process Substitution)的原理。