单引号字符的awk扫描字符串

时间:2012-08-29 19:10:14

标签: bash awk solaris

我有一行,我想知道它内是否有任何嵌入的单引号字符。使用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解决方案不适用。

有什么建议吗?

3 个答案:

答案 0 :(得分:11)

你有一个shell引用问题,我怀疑你将awk命令括在单引号中,即使转义也不能包含单引号。试试$'...'引用,可以包含转义单引号:

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

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

    # The rest of the awk code
   }'

答案 1 :(得分:7)

您应该使用:

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

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

badix = index($0, "\x27");

答案 2 :(得分: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"}'