我正在尝试执行以下操作,但要么我太累了,无法思考,要么逃跑时发生了一些奇怪的事情:
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 -->
如果 using 的另一种选择bash
是使用$''
which does support escaping single-quotes
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'
在手册页中查找字符串和正则表达式分隔符以获取详细信息。