Reputation: 463
I have this awk
statement:
glb_library="my_library"
awk "
/^Direct Dependers of/ { next }
/^---/ { next }
/^$glb_library:/ { ver=\$0; next }
{ gsub(/[[:space:]]/, '', \$0); print ver':'\$0 }
" file
Basically, I have enclosed the awk
code in double quotes so that the shell variable glb_library
is expanded. I have made sure to escape the $
character to prevent the shell from expanding $0
. Followed the guidance from here.
awk
gives me this error:
awk: syntax error at source line 5
context is
{ gsub(/[[:space:]]/, >>> ' <<<
I want to understand:
awk
? Why is ''
not a null string like ""
is?awk
treat single and double quotes differently?My code worked after I escaped the single quotes with backslashes and used \"\"
to represent the null string instead of ''
.
Upvotes: 8
Views: 8269
Reputation: 437988
A pragmatic summary:
As Ed Morton's helpful answer sensibly recommends:
Always use single quotes to enclose your awk
script as a whole ('...'
), which ensures that there's no confusion over what the shell interprets up front, and what awk
ends up seeing.
To define strings inside an awk
script, always use double quotes ("..."
).
"
is the only string delimiter awk
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 an awk
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.
'
) in your awk
script, you have three choices:
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
"..."
; 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
'\''
(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
Upvotes: 7
Reputation: 42999
Based on the comments above by awk experts and some research, I am posting this answer:
Further clarification:
""
is the null string in awk, not ''
"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.
Upvotes: 9
Reputation: 203625
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
Upvotes: 7