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

时间:2018-10-28 05:34:02

标签: 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/[,]*$//'

返回以下错误:

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

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

1 个答案:

答案 0 :(得分:1)

一个最小的例子:

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

解决方法:

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

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

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

如果您确实必须转义/,那么它将是:

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

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

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

'分隔的字符串中必须有2个转义符,因为awk必须先将字符串转换为正则表达式(解析过程1),然后再将其用作正则表达式(过程2)。

"分隔的字符串中必须有3个转义符,因为在这种情况下,您要特别告诉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'[:,}][^:/]' -k key="$KEY" '{for(i=1;i<=NF;i++){if($i~"\042"key"\042")

或更可取的是:

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