awk:用正则表达式分裂

时间:2014-02-25 16:04:34

标签: regex awk

我正在尝试使用以“|”分隔的字段来解析行和空间填充。我认为这很简单:

$ echo "1 a  | 2 b  |  3 c " | awk -F' *| *' '{ print "-->" $2 "<--" }'

然而,我得到的是

-->a<--

而不是预期的

-->2 b<--

我正在使用GNU Awk 4.0.1。

2 个答案:

答案 0 :(得分:4)

当您使用' *| *'时,awk会将其解释为space space。因此,你得到的输出是正确的。如果你需要|作为分隔符,那就逃避吧。

$ echo "1 a  | 2 b  |  3 c " | awk -F' *\\| *' '{ print "-->" $2 "<--" }'
-->2 b<--

请注意,您必须将其转义两次,因为在awk中,\|也被视为|,这将再次被解释为逻辑 OR

因此,在字符类[]中转义这些特殊字符非常受欢迎。

$ echo "1 a  | 2 b  |  3 c " | awk -F' *[|] *' '{ print "-->" $2 "<--" }'
-->2 b<--

答案 1 :(得分:0)

echo "1 a | 2 b | 3 c " | awk -F '|' '{print $2}' | tr -d ' '

为我生成“2 b”