我有这样的awk
声明:
glb_library="my_library"
awk "
/^Direct Dependers of/ { next }
/^---/ { next }
/^$glb_library:/ { ver=\$0; next }
{ gsub(/[[:space:]]/, '', \$0); print ver':'\$0 }
" file
Run Code Online (Sandbox Code Playgroud)
基本上,我已将awk
代码括在双引号中,以便glb_library
扩展shell变量.我已经确保逃避$
角色以防止外壳扩展$0
.遵循这里的指导.
awk
给我这个错误:
awk: syntax error at source line 5
context is
{ gsub(/[[:space:]]/, >>> ' <<<
Run Code Online (Sandbox Code Playgroud)
我想明白:
awk
?为什么''
不是像空字符串一样""
?awk
区别对待单引号和双引号?在我用反斜杠转义单引号并用来\"\"
表示空字符串而不是代码之后,我的代码工作''
.
永远不要用双引号括起任何脚本,否则你就是在判断自己是反斜杠的.这是您尝试执行的操作的语法:
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
Run Code Online (Sandbox Code Playgroud)
根据 awk 专家的上述评论和一些研究,我发布了这个答案:
进一步澄清:
""
是 awk 中的空字符串,而不是 ''
"Ed's answers are great!"
在 awk 中处理单引号时采用的其他技术是:
a) 使用一个变量,如 awk -v q="'" '{ print q }' ...
b) 使用八进制或十六进制表示法,如 awk '{ print "\047"$0"\047" }' ...
相关文档在这里。
一个务实的总结:
正如Ed Morton 的有用回答明智地建议:
始终使用单引号将您的脚本作为一个整体括起来awk
('...'
),这保证了有过什么没有混乱壳解释了前面,什么awk
最终看到的。
要定义字符串内的awk
脚本,总是用双引号("..."
)。
"
是唯一awk
识别的字符串分隔符。"..."
字符串是非插值的(您不能嵌入变量引用),但它们确实识别控制字符序列,例如\n
和\t
。单引号 ( '
)在脚本中没有语法意义awk
,但是,-如果您'...'
按照建议将其用于整个脚本-无论如何您都不能在其中使用文字'
,因为shell 的单引号字符串不允许嵌入 '
字符。
'
)awk
,您有以下三种选择:
awk
根据直接相邻的字符串文字和变量引用使用的字符串连接:awk -v q=\' 'BEGIN { print "I" q "m good." }' # -> I'm good
"..."
;为了获得最大的可移植性和消除歧义,请使用八进制转义序列 ( \047
),而不是十六进制转义序列( \x27
):awk 'BEGIN { print "I\047m good." }' # -> I'm good
'\''
(sic) 来“转义”嵌入的'
字符。(从技术上讲,正在连接3 个不同的单引号shell字符串文字)谢谢,snr:awk 'BEGIN { print "I'\''m good" }' # -> I'm good