我目前正在查看一些针对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不同。这个错误可能是其中之一吗?谢谢。
答案 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)