awk - 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 -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)
推荐阅读
- php - 如何向 Firebase 推送通知发送其他数据
- vega-lite - vega-lite:启用两个缩放动作
- r - 如何将 amelia 对象中的所有数据帧组合成一个数据帧?
- vba - 从 MS Access 表单自动填充 Outlook 电子邮件
- processing - 如何在处理中执行屋顶的绘图
- rest - 如何使用 REST + CodeceptJS 测试 API,访问受 Auth0 保护?
- performance - 为什么 replicateM (length xs) m 比 sequenceA (fmap (const m) xs) 更有效?
- python - 无法使用 Python 在 Github 中找到特定文件
- python - 是否可以使用递归来使用 Python 查找数组中每个元素的总和?
- python - 如何使用 Airflow 在 python 中运行 bash 脚本