为什么我不能在gawk中逃避引用?

Mas*_*sse 3 linux shell gawk

我正在尝试做以下事情,但要么我太累了又无法思考,或者有些奇怪的事情正在逃避:

scanimage -L | gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
pipe bquote> 
Run Code Online (Sandbox Code Playgroud)

Sie*_*geX 7

这样做的习惯是创建一个包含单引号的变量,然后使用:

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

但是,由于您在字符类中使用它,这不会起作用所以您需要这样做:

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

如果使用另一种方法bash是使用$''支持逃逸单引号

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

你在第二种情况下所做的就是在你的文字单引号之前创建一个单引号对,转义单引号,这样shell就不会解释它,然后在它之后创建另一个单引号对.

在正则表达式中使用单引号的示例

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

在正则表达式之外使用单引号的示例

$ echo "foo" | awk '{print q$0q}' q="'"
'foo'
Run Code Online (Sandbox Code Playgroud)

内部带单引号的示例 $''

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