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 ''
.
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:
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 -vq="'" '{ 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 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 -vq=\\' '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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.