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

时间:2012-02-05 09:47:33

标签: linux shell gawk

我正在努力做到以下几点,但要么我太累了又无法思考,或者有些奇怪的东西正在逃避:

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

5 个答案:

答案 0 :(得分:7)

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

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就不会解释它,然后在它之后再创建一个单引号对。 / p>

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

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

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

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

$''

内单引号的示例
echo $'foo`\'' | awk $'{gsub(/[o`\']/,"#")}1'
f####

答案 1 :(得分:2)

single quotes中有特殊字符,包括反斜杠(\)。

  

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

您可以将命令更改为:

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

答案 2 :(得分:1)

Shell'...'不支持反斜杠转义。你不得不使用“......”,我很害怕。

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

(注意shell“...” 扩展$ variables,所以你也需要转义它!)

答案 3 :(得分:0)

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

有点难看,但这有效:

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

答案 4 :(得分:0)

正确的方法是:

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

它不会影响单引号使用\047,但是如果所有其他发布的解决方案都使用字符串分隔符,请注意使用regexp分隔符而不是围绕正则表达式的字符串分隔符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

在regexp上下文中使用字符串分隔符的唯一时间是需要将文字与变量连接起来,例如:

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

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