【问题标题】:awk scan string for single quote characterawk 扫描字符串以获取单引号字符
【发布时间】:2012-08-24 11:25:15
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: bash awk solaris


    【解决方案1】:

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

    awk $'{
        # Lots of other awk code...
    
        badix=index($0, "\'") }'
    
        # The rest of the awk code
       }'
    

    【讨论】:

    • 实际上,这是一个更大的 awk 脚本中的一行,由 bash 脚本调用。 awk 脚本已经具有语法 awk '{一大堆 awk 代码...这一行 awk 代码 ... morw awk 代码}'。在没有 awk 的情况下尝试了您的语法,但它引发了错误。
    • 所以你的 bash 脚本中有类似 awk -f myscript.awk 的东西,而在 myscript.awk 中除了 awk 命令之外什么都没有?
    • 不过,这是一种 Bashism。好的,标记为bash 的问题,但也许值得一个小小的警告。
    • @JimR - 根据您的评论,听起来您仍在将脚本作为命令行参数传递给awk,在这种情况下,仍必须正确引用整个脚本。跨度>
    【解决方案2】:

    你应该使用:

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

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

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

    【讨论】:

    • @anubhava 4个双引号和3个单引号匹配一个单引号?我对这种语法有点困惑。你能解释一下这是如何工作的吗?顺便说一下弄清楚这个语法的荣誉,这确实工作得很好。
    • 首先单引号是退出单引号awk命令,最后一个单引号是再次进入单引号awk命令。 "'" 用于使用文字单引号。但是我认为index($0, "\x27") 会更干净(答案已编辑)
    【解决方案3】:

    这里有几种方法:

    将 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"}'
    

    【讨论】:

    • 实际上,这是一个更大的 awk 脚本中的一行,由 bash 脚本调用。 awk 脚本已经具有语法 awk '{一大堆 awk 代码...这一行 awk 代码 ... morw awk 代码}'。惊讶地得知 nawk 在 xpg4 中被称为 awk。明天再玩这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多