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

Difference between single and double quotes in awk

我有这个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 扩展 [=16=]。遵循 here.

的指导

awk 给我这个错误:

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

我想了解:

在我用反斜杠转义单引号并使用 \"\" 代替 ''.

来表示空字符串后,我的代码工作正常

切勿将任何脚本括在双引号中,否则您将自己判处反斜杠地狱。这是您要执行的操作的语法:

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

根据以上 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 "7"[=14=]"7" }' ...


相关文档here.

务实总结:

  • 正如 明智地建议:
    始终使用引号将您的awk 脚本作为一个整体 ('...'),这确保不会混淆 shell 预先解释 的内容,以及 awk 结束的内容上来看一看。

  • awk脚本中定义字符串,总是使用 引号 ("...").

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

    • 如果您确实需要在您的[中使用文字单引号(') =10=] script,你有3个选择:
      • 传递定义它的变量,并使用awk的字符串连接,基于直接相邻的字符串文字和变量引用:
        awk -v q=\' 'BEGIN { print "I" q "m good." }' # -> I'm good
      • "..."中使用转义序列;为了获得最大的可移植性和消除歧义,请使用 octal 转义序列 (7),而不是 hex (\x27) :
        awk 'BEGIN { print "I7m good." }' # -> I'm good
      • 使用 '\''(原文如此)来 "escape" 嵌入 ' 个字符。 (从技术上讲,3 个不同的单引号 shell 字符串文字被连接起来)谢谢,snr:
        awk 'BEGIN { print "I'\''m good" }' # -> I'm good