3

我正在尝试执行以下操作,但要么我太累了,无法思考,要么逃跑时发生了一些奇怪的事情:

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

5 回答 5

7

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

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####
于 2012-02-05T09:50:39.847 回答
2

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

将字符括在单引号 ( ') 中会保留引号内每个字符的文字值。单引号之间不能出现单引号,即使前面有反斜杠。

您可以将命令更改为:

$ scanimage -L | awk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
于 2012-02-05T09:52:54.430 回答
1

Shell '...' 不支持反斜杠转义。恐怕您必须改用“...”。

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

(请注意,shell "..."确实扩展了 $ 变量,因此您也需要对其进行转义!)

于 2012-02-05T09:53:35.973 回答
0
gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
     ^                         ^
     beginning of sq string       end of single quoted string

有点难看,但这有效:

gawk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
于 2012-02-05T09:54:55.713 回答
0

正确的方法很简单:

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'

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

于 2014-09-22T13:07:29.003 回答