代码之家  ›  专栏  ›  技术社区  ›  user321627

awk:警告:在Mac OSX终端中运行命令时,转义序列“\/”被视为普通“/”错误

awk
  •  0
  • user321627  · 技术社区  · 6 年前

    我目前正在阅读一些针对linux系统的代码(我正在使用Mac),并一直在尝试运行这个程序 awk

    awk -F"[:,}][^:\/\/]" '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/)
    {print $(i+1)}}}' | tr -d '"' | sed -n ${num}p | sed -e 
    's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[,]*$//'
    

    awk: warning: escape sequence `\/' treated as plain `/'.
    

    我知道某些实现和语法与Mac和Linux不同。这个错误可能是其中之一吗?谢谢

    1 回复  |  直到 6 年前
        1
  •  4
  •   Ed Morton    4 年前

    一个简单的例子:

    $ awk -F"[:,}][^:\/\/]" '1' /dev/null
    awk: warning: escape sequence `\/' treated as plain `/'
    

    修复方法:

    $ awk -F'[:,}][^://]' '1' /dev/null
    $
    

    i、 在动态regexp中没有理由逃避前斜杠。您必须用regexp文本(例如。 /foo\/bar/ )因为它们是regexp分隔符,而不是因为它们是regexp元字符,所以在动态regexp(存储在字符串中并由字符串分隔符而不是regexp分隔符分隔的)中不是这样。我也修正了你的报价。

    / [/] 与的字符集完全相同 [//] [///////] .

    / 那就是:

    $ awk -F'[:,}][^:\\/]' '1' /dev/null
    $
    

    如果您在原始代码中使用了错误的引号:

    $ awk -F"[:,}][^:\\\/]" '1' /dev/null
    $
    

    这两个逃逸在该过程中是必要的 '

    " -分隔字符串,因为在这种情况下,您特别告诉shell解析字符串,因此shell必须先解析它(传递1),然后再将其传递给awk,然后awk必须将该字符串转换为regexp(传递2),然后再将其用作regexp(传递3)。

    顺便说一句,脚本的其余部分使用的shell变量不正确。这:

    awk -F'[:,}][^:/]' '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/)
    

    awk -F'[:,}][^:/]' '{for(i=1;i<=NF;i++){if($i~/\042'"$KEY"'\042/)
    

    但正确的方法是:

    awk -F'[:,}][^:/]' -v key="$KEY" '{for(i=1;i<=NF;i++){if($i~"\042"key"\042")
    

    或者最好:

    awk -F'[:,}][^:/]' -v key="\"$KEY\"" '{for(i=1;i<=NF;i++){if($i~key)