我有一行,我想知道它内是否有任何嵌入的单引号字符。使用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解决方案不适用。
有什么建议吗?
答案 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"}'