为什么我不能逃避报价?

我正在努力做到以下几点,但是我太累了,无法想象,或者有些奇怪的事情正在逃避:

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

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

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

然而,既然你正在使用它在一个字符类,这是不会工作,所以你需要这样做:

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

如果使用bash另一个选择是使用$''支持转义单引号

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

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

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

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

在正则表达式之外的单引号的例子

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

$''使用单引号的例子

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

单引号中 没有特殊字符,包括反斜杠( \ )。

用单引号括起来的字符( ' )保留引号内每个字符的字面值。 单引号之间可能不会出现单引号,即使前面带有反斜杠。

您可以将命令更改为:

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

Shell'…'不支持反斜杠转义。 恐怕你必须用“…”来代替。

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

(请注意,shell“…” 不会展开$变量,所以您也需要将其转义!)

 gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}' ^ ^ beginning of sq string end of single quoted string 

有点难看,但是这个工作:

 gawk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}' 

正确的做法是:

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

这不会影响使用\047作为单引号,但是由于所有其他发布的解决方案都使用了字符串分隔符,所以请注意使用正则表达式分隔符而不是使用正则表达式作为gsub()的第一个参数的字符串分隔符。 重要的是,看例如:

 $ printf 'a\\tb\n' | awk '{sub(/\\t/,"X")}1' aXb $ printf 'a\\tb\n' | awk '{sub("\\t","X")}1' a\tb $ printf 'a\\tb\n' | awk '{sub("\\\\t","X")}1' aXb 

在正则表达式上下文中唯一使用字符串分隔符的时候是你需要连接一个文字和一个变量,例如:

 awk '{sub("<"var">","")}1' 

查看手册页中的字符串和正则表达式分隔符以获取详细信息。