mbi*_*ras 3 regex unix bash awk
我读到另一个答案,它展示了如何使用-F
标志设置字段分隔符:
awk -F 'INFORMATION DATA ' '{print $2}' t
Run Code Online (Sandbox Code Playgroud)
现在我很好奇如何使用正则表达式作为字段分隔符。我的尝试如下所示:
$ echo "1 2 foo\n2 3 bar\n42 2 baz"
1 2 foo
2 3 bar
42 2 baz
$ echo "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '\d+ \d+ ' '{ print $2 }'
# 3 blank lines
Run Code Online (Sandbox Code Playgroud)
我期望得到以下输出:
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)
这是因为我的正则表达式\d+ \d+
匹配“前两个数字由空格分隔,后跟空格”。但我正在打印第二条记录。如红宝石所示:
首先,echo
不会自动转义并输出文字\n
。因此,您需要添加-e
以启用转义。其次awk
不支持\d
,所以你必须使用[0-9]
or [[:digit:]]
。
echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[0-9]+ [0-9]+ ' '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)
或者
echo -e "1 2 foo\n2 3 bar\n42 2 baz" | awk -F '[[:digit:]]+ [[:digit:]]+ ' '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)
两个输出:
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)