Difference between single and double quotes in awk
Never enclose any script in double quotes or you're sentencing yourself to backslash-hell. This is the syntax for what you're trying to do:
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
Based on the comments above by awk experts and some research, I am posting this answer:
- awk strings are enclosed in double quotes, not single quotes; more precisely: single quotes are not string delimiters in awk, unlike shell
- awk attaches no special meaning to single quotes and they need to be enclosed in double quotes if used in string literals
- it is best to use single quotes to wrap awk statements on command line, unlike OP's code that's using double quotes (Ed pointed this out clearly)
Further clarification:
""
is the null string in awk, not''
- to use single quotes in an awk string literal, enclose them in double quotes, as in
"Ed's answers are great!"
other techniques followed while handling single quotes in awk are:
a) use a variable, as in
awk -v q="'" '{ print q }' ...
b) use octal or hex notation, as in
awk '{ print "\047"$0"\047" }' ...
Relevant documentation here.
A pragmatic summary:
As Ed Morton's helpful answer sensibly recommends:
Always use single quotes to enclose yourawk
script as a whole ('...'
), which ensures that there's no confusion over what the shell interprets up front, and whatawk
ends up seeing.To define strings inside an
awk
script, always use double quotes ("..."
)."
is the only string delimiterawk
recognizes."..."
strings are non-interpolating (you cannot embed variable references), but they do recognize control-character sequences such as\n
and\t
.
A single quote (
'
) has no syntactic meaning inside anawk
script, but, - if you're using'...'
for your overall script, as recommended - you cannot use a literal'
inside of it anyway, because the shell's single-quoted strings do not permit embedded'
chars.- If you do need to use a literal single quote (
'
) in yourawk
script, you have three choices:- Pass a variable that defines it, and use
awk
's string concatenation, based on directly adjoining string literals and variable references:
awk -v q=\' 'BEGIN { print "I" q "m good." }' # -> I'm good
- Use an escape sequence inside
"..."
; for maximum portability and disambiguation, use an octal escape sequence (\047
), not a hex one (\x27
):
awk 'BEGIN { print "I\047m good." }' # -> I'm good
- Use
'\''
(sic) to "escape" embedded'
chars. (technically, 3 distinct single-quoted shell string literals are being concatenated)Thanks, snr:awk 'BEGIN { print "I'\''m good" }' # -> I'm good
- Pass a variable that defines it, and use
- If you do need to use a literal single quote (