我有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
会不同地处理单引号和双引号?我使用反斜杠转义单引号并使用\"\"
代表空字符串而不是''
后,我的代码正常工作。
答案 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中的空字符串,而不是''
"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
):"..."