在awk中使用'('(空格后跟括号)作为字段分隔符

ps-*_*aux 7 regex awk

awk脚本中,我试图使用 ' (' 作为字段分隔符。但是,除非我用双反斜杠转义括号,如下所示:

BEGIN {FS=" \\("}
Run Code Online (Sandbox Code Playgroud)

这是行不通的。

如果我使用FS=" \("我得到

awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
Run Code Online (Sandbox Code Playgroud)

输出,如果我根本不转义括号,我只会得到

awk: prog:2: fatal: :, [., or [=: / (/ 信息。

你能解释一下这种行为吗?

Kus*_*nda 8

要在 中使用?((空格+括号)作为字段分隔符awk,请使用"?\\\("

$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c
Run Code Online (Sandbox Code Playgroud)

或者,使用单引号和两个反斜杠:

$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c
Run Code Online (Sandbox Code Playgroud)

这样做的原因是?(前导空格的单括号)是格式错误的正则表达式。左括号打开一个永远不会关闭的分组。这就是为什么它需要转义。

之所以说((一个括号没有前导空格)的工作原理是,当FS某一个字符,它不是一个正则表达式处理。