0

因此,我正在运行一个派生名称的目录以插入 MySQL 数据库。一些名称有一个单引号 (')。我正在使用 awk

ls *| awk -F=: '{print "INSERT into citation_sources (source_name) VALUES (" "'\''" $1 "'\''" ");"}'

虽然我可以让输出从 awk 正确显示。例如:

INSERT into citation_sources (source_name) VALUES ('Black's Law Dictionary, 2nd Edition (Black 1891));

当需要将数据插入 MySQL 时,我想避免必须进行第二次数据编辑才能正确转义单引号\'

我在我的 awk 中缺少什么来为我做这件事?

4

2 回答 2

0

在它进入 awk 之前解决这个问题是最简单的。如果您没有lsAncient ,只需将 -Q (引号)添加到参数列表中:

$ ls -Q * | awk -F=: '{print "INSERT into citation_sources (source_name) VALUES (" "'\''" $1 "'\''" ");"}'
INSERT into citation_sources (source_name) VALUES ('"Black's Law Dictionary, 2nd Edition (Black 1891)"');

正如@shellter 所说,这是您应该考虑如何真正引用这些值的时候。

或者,首先通过 sed 或类似方法将其管道化,以获取反斜杠(例如sed "s,',\\\\',g")。

通过 awk 转义来解决它比人们想象的要棘手,因为 bash 会吃掉引号并转义。因此,产生 '\' 是最具挑战性的部分,我最终生成了 out-of-awk shell 以使其生存:

$ ls * | awk -F=: "{print \"INSERT into citation_sources (source_name) VALUES ('\" gensub(\"'\",\""$'\\\\'"\\\'\",\"global\",\$1) \"');\"}"
INSERT into citation_sources (source_name) VALUES ('Black\'s Law Dictionary, 2nd Edition (Black 1891)');
于 2012-07-01T17:37:55.673 回答
0

在 awk 脚本的 BEGIN{} 部分中有这个。

echo "Black's Law D'icti'onary"|awk '{
ESC=sprintf("%c",0x5c);
SQ=sprintf("%c",0x27);
DQ=sprintf("%c",0x22);
# then perfrom a 
gsub(SQ,ESC""SQ);
# and such. same goes for other stuff.
}'

很方便:-)

于 2012-08-13T08:18:25.043 回答