首页 > 解决方案 > awk:警告:在 Mac OSX 终端中运行命令时,转义序列 `\/' 被视为普通 `/' 错误

问题描述

我目前正在浏览一些适用于 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 不同。这个错误可能是其中之一吗?谢谢。

标签: awk

解决方案


一个最小的例子:

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

修复:

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

即没有理由在动态正则表达式中转义正斜杠。您必须在正则表达式文字(例如/foo\/bar/)中对它们进行转义,因为它们是正则表达式分隔符,而不是因为它们是正则表达式元字符,因此在动态正则表达式中不是这种情况(存储在字符串中并由字符串分隔)定界符,而不是正则表达式定界符)。我还修正了你的报价。

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

如果您确实必须逃脱,/那么它将是:

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

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

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

'-delimited 字符串中需要 2 个转义,因为 awk 必须先将字符串转换为 regexp(解析 pass 1),然后才能将其用作 regexp(pass 2)。

3 个转义符在"-delimited 字符串中是必需的,因为在这种情况下,您专门告诉 shell 解析字符串,因此 shell 必须先解析它(传递 1),然后再将其传递给 awk,然后 awk 必须将字符串转换为一个正则表达式(第 2 遍),然后将其用作正则表达式(第 3 遍)。

顺便说一句,您的脚本的其余部分错误地使用了 shell 变量。这个:

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

如果可以让 shell 变量扩展成为 awk 脚本文本的一部分(它不是),则可以写为:

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)

推荐阅读