awk中单引号和双引号之间的区别

时间:2017-06-08 21:28:52

标签: bash awk quotes

我有awk声明:

glb_library="my_library"
awk "
        /^Direct Dependers of/ { next }
        /^---/                 { next }
        /^$glb_library:/       { ver=\$0; next }
                               { gsub(/[[:space:]]/, '', \$0); print ver':'\$0 }
      " file

基本上,我已将awk代码括在双引号中,以便扩展shell变量glb_library。我已确保转义$字符以防止shell展开$0。遵循here的指导。

awk给了我这个错误:

awk: syntax error at source line 5
 context is
                                   { gsub(/[[:space:]]/, >>>  ' <<<

我想明白:

  • awk中使用单引号是否合法?为什么''不是""之类的空字符串?
  • awk会不同地处理单引号和双引号?

我使用反斜杠转义单引号并使用\"\"代表空字符串而不是''后,我的代码正常工作。

3 个答案:

答案 0 :(得分:5)

永远不要将任何脚本用双引号括起来,否则你会自我判断为反斜杠。这是您尝试执行的操作的语法:

glb_library="my_library"
awk -v glb_library="$glb_library" '
        /^Direct Dependers of/ { next }
        /^---/                 { next }
        $0 ~ "^"glb_library":" { ver=$0; next }
                               { gsub(/[[:space:]]/, ""); print ver":"$0 }
      ' file

答案 1 :(得分:1)

基于awk专家和一些研究的上述评论,我发布了这个答案:

  • awk字符串用双引号括起来,而不是单引号;更确切地说: 单引号在awk中不是字符串分隔符,与shell不同
  • awk对单引号没有特殊含义,如果在字符串文字中使用,则需要用双引号括起来
  • 最好使用单引号在命令行上包装awk语句,这与OP的使用双引号的代码不同(Ed明确指出了这一点)

进一步澄清:

  • ""是awk中的空字符串,而不是''
  • 在awk字符串文字中使用单引号,用双引号括起来,如"Ed's answers are great!"
  • 在处理awk中的单引号时遵循的其他技巧是:

    a)使用变量,如awk -v q="'" '{ print q }' ...

    b)使用八进制或十六进制表示法,如awk '{ print "\047"$0"\047" }' ...

相关文档here

答案 2 :(得分:1)

务实的总结:

  • 正如Ed Morton's helpful answer明智地建议:
    始终使用单个引号将@TestPropertySource 脚本作为一个整体/tmp括起来,这样可以确保&# 39;对于 shell 解释预先的内容以及awk最终看到的内容没有混淆。

  • 在内定义字符串 '...'脚本,总是使用 double 引号({{1 }})

    • awk是唯一的字符分隔符awk识别。
    • "..."字符串非插值(您无法嵌入变量引用),但它们确实识别控制字符序列,例如"awk
  • 单引号("...")在\n脚本中没有语法含义,但是, - 如果你&#39 ;按照建议使用\t为您的整体脚本 - 无论如何都不能在其中使用文字' ,因为 shell的单引号字符串不允许嵌入 awk字符。

    • 如果您 需要在'...'脚本中使用文字单引号('),你有两个选择:
      • 传递定义它的变量,并使用'的字符串连接,基于直接相邻的字符串文字和变量引用:
        '
      • awk内使用转义序列;为了获得最大的可移植性和消歧,请使用 octal 转义序列(awk),而不是 hex 转义序列awk -v q=\' 'BEGIN { print "I" q "m good." }' # -> I'm good):
        "..."