在awk
脚本中我尝试使用' ('作为字段分隔符。但是除非我使用双反斜杠转义括号,否则如下所示:
BEGIN {FS=" \\("}
这是行不通的。
如果我使用FS=" \("
我得到
awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/
输出,如果我没有转义括号,我只会得到
awk: prog:2: fatal: :, [., or [=: / (/
信息。
你能解释一下这种行为吗?
答案1
要使用␣(
(空格+括号)作为字段分隔符awk
,请使用"␣\\\("
:
$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c
或者,使用单引号和两个反斜杠:
$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c
原因是␣(
(一个括号和左括号(前导空格)是格式错误的正则表达式。左括号打开了一个永不关闭的分组。这就是为什么需要对其进行转义。
原因是(
(一个括号没有一个字符(以空格开头)的作用是,当FS
是单个字符时,它不会被视为正则表达式。
答案2
我在搜索类似问题的解决方案时发现了这个帖子 - 使用␣
OR(
作为 awk 的字段分隔符。这并没有完全回答这个问题,但让我来看看我的解决方案:
如果您希望将组合␣(
作为一个单元来在 awk 中分隔文件,请执行以下操作awk -F '( \\()' ...
:
$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()
Number of Fields: 2
如果您正在寻找与我类似的问题的解决方案 - 或者␣
,(
请执行以下操作awk -F '( |\\()' ...
:
$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe)
is
a
test
)
Number of Fields: 7