我使用的是带有 bash shell 的 Ubuntu Linux。如何在 awk 语句中转义撇号?我想在使用 awk 从文件中提取数据后输出一些 SQL,因此我有:
awk -F',' '{print "SELECT * from user where id = '"$2"';"}' myfile.csv
但这仅打印出:
SELECT * from user where id = ;
如果我修改以上内容为
awk -F',' '{print "SELECT * from user where id = "$2";"}' myfile.csv
然后我得到了这样的声明
SELECT * from user where id = cf915247dfcf47b6814b5350e5cbdfd8;
但是 id 周围没有单引号,而我需要它。
答案1
您可能需要通过两种方式来解决这个问题:
通过变量传递单引号:
awk -v sq="'" -F',' '{print "SELECT * from user where id = "sq$2sq";"}' myfile.csv
在 printf 语句中使用单引号的十六进制值:
awk -F',' '{printf "SELECT * from user where id = %c%s%c;\n",0x27,$2,0x27}' myfile.csv
答案2
你可以只需使用\47
(或\047
)在您的字符串中,这awk
意味着'
。
awk -F, '{print "SELECT * from user where id = \47" $2 "\47;"}' myfile.csv
这有点不雅(“重复的是什么魔法值'47' 做什么?!”),但语法很干净,而且这种制作单引号的技巧是漂亮的 出色地 已知。
awk
是特殊对待\47
,而不是你的 shell。在'
'
-quoted 字符串中,Bourne 风格的 shell(如 Bash)不履行任何扩展。C Shell 也类似tcsh
,但它们不会扩展\47
,但仍然有效。
您可能更喜欢使用\047
而不是\47
。它们都可以使用,除非\47
后面紧跟着一个八进制数字(0-7),在这种情况下您必须使用\047
以避免指示错误的字符。请注意,与某些语言不同,即使没有前导; ,47
中的也是八进制的,见下文。\47
0
是什么意思?为什么\47
使用\47
那样用途0x27
?
这是因为两个十六等于四个八。
与 进行检查,python -c 'print int("47", 8), int("27", 16)'
结果39 39
与预期一致。
答案3
这看上去有点疯狂,但事实就是这样:
awk -F',' '{print "SELECT * from user where id = '"'"'" $2 "'"'"'" ";"}' myfile.csv
SELECT * from user where id = 'cf915247dfcf47b6814b5350e5cbdfd8';
希望这可以帮助!