如何在 awk 语句中转义撇号?

如何在 awk 语句中转义撇号?

我使用的是带有 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

您可能需要通过两种方式来解决这个问题:

  1. 通过变量传递单引号:

    awk -v sq="'" -F',' '{print "SELECT * from user where id = "sq$2sq";"}' myfile.csv
    
  2. 在 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中的也是八进制的,见下文。\470

是什么意思?为什么\47使用\47那样用途0x27

这是因为两个十六等于四个八。

  • \47是一个八进制字符序列,因此为 4×8 + 7×1 = 39。
  • 0x27十六进制数字文字,所以它是 2×16 + 7×1 = 39。
    然后 的printf说明符%c将其格式化为字符。

与 进行检查,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';

希望这可以帮助!

相关内容