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

Jim*_*imR 3 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
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

che*_*ner 11

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

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

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

    # The rest of the awk code
   }'
Run Code Online (Sandbox Code Playgroud)

  • +1)不知道'$'......'` - 非常有用,谢谢. (2认同)

anu*_*ava 7

你应该使用:

badix = index($0, "'"'"'"); 
Run Code Online (Sandbox Code Playgroud)

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

badix = index($0, "\x27");
Run Code Online (Sandbox Code Playgroud)


gei*_*rha 5

这有几种方法:

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

$ cat awkscript
#!/bin/awk -f
BEGIN{print "'"}
$ awk -f awkscript </dev/null
'
$ chmod +x awkscript
$ ./awkscript </dev/null
'
Run Code Online (Sandbox Code Playgroud)

从shell运行它,在那里将脚本括在'引号中,结束'quote,concat a literal'引用,然后开始一个新的引用.

awk 'BEGIN{print "'\''"}' </dev/null
Run Code Online (Sandbox Code Playgroud)

使用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"}'
Run Code Online (Sandbox Code Playgroud)