awk 字段分隔符错误?

gas*_*ter 3 awk

这是 awk 字段分隔符的预期工作方式:

$ echo 'fooXbar' | awk 'BEGIN {FS="X"} {print $1}'
foo
$ echo 'fooXbar' | awk 'BEGIN {FS="X"} {print $2}'
bar
$ 
Run Code Online (Sandbox Code Playgroud)

但如果 FS 是“-|-”,那么事情就变得奇怪了:

$ echo 'foo-|-bar' | awk 'BEGIN {FS="-|-"} {print $1}'
foo
$ echo 'foo-|-bar' | awk 'BEGIN {FS="-|-"} {print $2}'
|
$ echo 'foo-|-bar' | awk 'BEGIN {FS="-|-"} {print $3}'
bar
$ 
Run Code Online (Sandbox Code Playgroud)

为什么?为什么 $2 是“|” 在第二个例子中??

更新:

$ echo 'foo-|-bar' | awk 'BEGIN {FS="-\|-"} {print $2}'
awk: warning: escape sequence `\|' treated as plain `|'
|
$ 
Run Code Online (Sandbox Code Playgroud)

n.s*_*.st 8

FS是正则表达式:awk 解释-|-为“--”。

使用-\|-来代替。您需要将字符串文字中的反斜杠加倍。

echo 'foo-|-bar' | awk 'BEGIN {FS="-\\|-"} {print $1}'
Run Code Online (Sandbox Code Playgroud)

或者

echo 'foo-|-bar' | awk -F '-\\|-' '{print $2}'
Run Code Online (Sandbox Code Playgroud)