awk:警告:转义序列“\/';视为普通`/';在Mac OSX终端中运行命令时出错

awk:警告:转义序列“\/';视为普通`/';在Mac OSX终端中运行命令时出错,awk,Awk,我目前正在阅读一些针对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/[,]*$//' 我知道某些实现和语法与Mac和Li

我目前正在阅读一些针对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/[,]*$//'
我知道某些实现和语法与Mac和Linux不同。这个错误可能是其中之一吗?谢谢。

一个简单的例子:

$ 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
$
分隔的字符串中,两个转义是必需的,因为awk必须先将字符串转换为regexp(解析过程1),然后再将其用作regexp(过程2)

分隔的字符串中,3个转义是必需的,因为在这种情况下,您特别告诉shell解析字符串,因此shell必须在将其传递给awk之前先解析它(传递1),然后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一个最简单的例子:

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

$ awk -F'[:,}][^://]' '1' /dev/null
$
i、 e.没有理由在动态regexp中转义正斜杠。必须在regexp文本(例如
/foo\/bar/
)中转义正斜杠,因为它们是regexp分隔符,而不是因为它们是regexp元字符,所以在动态regexp中不是这样(存储在字符串中并由字符串分隔符(而不是regexp分隔符)分隔的。我还修复了引号

请注意,在括号表达式中重复相同的字符(例如,
/
)是没有用的。
[/]
[/]
[/]
是完全相同的字符集

如果您确实必须退出
/
,那么它将是:

$ awk -F'[:,}][^:\\/]' '1' /dev/null
$
如果您在原始代码中使用了错误的引号:

$ awk -F"[:,}][^:\\\/]" '1' /dev/null
$
分隔的字符串中,两个转义是必需的,因为awk必须先将字符串转换为regexp(解析过程1),然后再将其用作regexp(过程2)

分隔的字符串中,3个转义是必需的,因为在这种情况下,您特别告诉shell解析字符串,因此shell必须在将其传递给awk之前先解析它(传递1),然后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您想使用哪些字符作为分隔符?为什么
\/
出现两次?请将示例输入和该示例输入的所需输出添加到您的问题中。您请求帮助调试来自awk脚本的错误消息,因此不要发布带有awk+tr+sed+sed脚本的管道,只需发布产生错误的脚本即可消息。请参阅并特别注意创建(强调最小值)。您希望使用哪些字符作为分隔符?为什么
\/
出现两次?请将示例输入和该示例输入的所需输出添加到您的问题中。您请求帮助调试来自awk脚本的错误消息,因此不要发布带有awk+tr+sed+sed脚本的管道,只需发布产生错误消息的脚本即可年龄。请参阅并特别注意创建一个(强调最小值)。在您的示例脚本中,我非常确定您的意思是
-v key=…
而不是
-k key=…
。在您的示例脚本中,我非常确定您的意思是
-v key=…
而不是
-k key=…