3

我有一行,我想知道它是否有任何嵌入的单引号字符。使用awk,我尝试了几种变体

badix = index($0,"\047") -- this does not find it
badix = index($0, "'") -- throws a fit
badix = index($0, "\'") -- throws a fit
badix = index($0, \') -- throws a fit

这适用于 Solaris 10 上的 awk,因此 gawk 解决方案在这种情况下不适用。

有什么建议么?

4

3 回答 3

11

您遇到了 shell 引用问题,我怀疑您将awk命令括在单引号中,即使转义,单引号本身也不能包含单引号。尝试$'...'引用,其中可以包含转义的单引号:

awk $'{
    # Lots of other awk code...

    badix=index($0, "\'") }'

    # The rest of the awk code
   }'
于 2012-08-29T19:38:38.510 回答
7

你应该使用:

badix = index($0, "'"'"'"); 

或使用十六进制值\x27作为单引号:

badix = index($0, "\x27");
于 2012-08-29T19:32:53.193 回答
5

这里有几个方法:

将 awk 脚本放在您运行的单独文件中-f,在这种情况下,您可以避免使用 shell 引号,因此"'"可以使用

$ cat awkscript
#!/bin/awk -f
BEGIN{print "'"}
$ awk -f awkscript </dev/null
'
$ chmod +x awkscript
$ ./awkscript </dev/null
'

从 shell 运行它,将脚本括在 ' 引号中,结束 ' 引号,连接文字 ' 引号,然后开始一个新的 ' 引号。

awk 'BEGIN{print "'\''"}' </dev/null

请改用 nawk,它安装为/usr/xpg4/bin/awk. 它是 posix 兼容的,而且更没用。

PATH=/usr/xpg4/bin:$PATH
awk -v q=\' 'BEGIN{print q}'
awk 'BEGIN{print "\x27"}'
awk 'BEGIN{print "\047"}'
于 2012-08-29T19:43:08.837 回答