shell管道中的转义SQL参数
我的shell脚本中有这个shell管道中的转义SQL参数,sql,shell,sed,awk,escaping,Sql,Shell,Sed,Awk,Escaping,我的shell脚本中有这个 ./osmfilter austria-latest.osm --keep="$key=$value" | ./osmconvert - --all-to-nodes --csv="@id @lat @lon @timestamp $key name" --csv-headline | awk -F "\t" '{if($5 != "" && $6 != "") print "INSERT INTO nodes (name, timestamp, la
./osmfilter austria-latest.osm --keep="$key=$value" |
./osmconvert - --all-to-nodes --csv="@id @lat @lon @timestamp $key name" --csv-headline |
awk -F "\t" '{if($5 != "" && $6 != "") print "INSERT INTO nodes (name, timestamp, lat, lon, cid) VALUES (\"",$6,"\",\"",$4,"\",",$2,",",$3,","'$cid'");"}'
> $value.sql
sed -i '1d' $value.sql
现在,一行输出通常类似于:
INSERT INTO nodes (name, timestamp, lat, lon, cid) VALUES (" OMV "," 2013-06-21T19:46:57Z ", 48.2160931 , 14.2793397 ,2);
但如果名称中有“或”,则SQL导入将失败:
INSERT INTO nodes (name, timestamp, lat, lon, cid) VALUES (" "Landkauf" Bund "," 2014-01-04T10:42:33Z ", 46.7899638 , 15.8526000 ,2);
我可以告诉awk转义所有“内部”,例如$6输出吗?
不必是awk您可以通过以下方式逃避所有的
“
:
awk '{gsub("\"", "\\\"", $6)}
例子
全部
您当前正在使用
awk -F "\t" '{if($5 != "" && $6 != "") print "INSERT INTO nodes (name, timestamp, lat, lon, cid) VALUES (\"",$6,"\",\"",$4,"\",",$2,",",$3,","'$cid'");"}'
但可以重新格式化为:
awk -F "\t" '$5 && $6 {gsub("\"", "\\\"", $6); printf "INSERT INTO nodes (name, timestamp, lat, lon, cid) VALUES (\"%s\", \"%s\", \"%s\", \"%s\", \"%s\");\n", $6, $4, $2, $3, cid}' cid=$cid
因为:
相当于如果($5!=”&&&$6!=”)
$5&&$6
可以让您更好地控制打印内容printf
您不能使用那样的bash变量。您必须使用$cid
并使用cid
作为示例cid=$cid
xxd -ps -c 1 input.txt | sed -e 's/22/5c22/g' -e 's/27/5c27/g' | xxd -r -p
说明:
将输入文件转换为ascii十六进制代码,每行一个字符xxd-ps-c1
将“转换为”'s/22/5c22/g'
将“转换为”'s/27/5c27/g'
将十六进制字符还原为文本字符并恢复文件xxd-r-p
|xxd-r-p>input.txt.fix和&mv-f input.txt.fix input.txt那样重定向?
xxd -ps -c 1 input.txt | sed -e 's/22/5c22/g' -e 's/27/5c27/g' | xxd -r -p