Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can't I escape quote in gawk?

Tags:

linux

shell

gawk

I'm trying to do the following, but either I'm way too tired and can't think, or something weird is hapening with the escapes:

scanimage -L | gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
pipe bquote> 
like image 859
Masse Avatar asked Dec 18 '25 23:12

Masse


2 Answers

The idiom to do this is to create a variable which contains the single quote and then use that:

scanimage -L | gawk '/N650U/ {print gensub(q"`", "", "g", $2)}' q="'"

However, since you are using it in a character class, that is not going to work so you'll need to do this:

scanimage -L | gawk '/N650U/ {print gensub("[`'\'']", "", "g", $2)}'
                    <--      1st pair       -->  <--   2nd pair  -->

Another alternative if using bash is to use $'' which does support escaping single-quotes

scanimage -L | gawk $'/N650U/ {print gensub("[`\']", "", "g", $2)}'

All you are doing in the 2nd case is creating a single-quote pair right before your literal single-quote, escaping the single quote so the shell doesn't interpret it and then make another single-quote pair after it.

Example with single-quote in a regex

$ echo $'foo`\'' | awk '{gsub(/[o`'\'']/,"#")}1'
f####

Example with single-quote outside a regex

$ echo "foo" | awk '{print q$0q}' q="'"
'foo'

Example with single-quote inside $''

echo $'foo`\'' | awk $'{gsub(/[o`\']/,"#")}1'
f####
like image 67
SiegeX Avatar answered Dec 21 '25 12:12

SiegeX


There's no special character in single quotes including backslash(\).

Enclosing characters in single quotes (') preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

You can change the command to:

$ scanimage -L | awk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
like image 34
kev Avatar answered Dec 21 '25 14:12

kev