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

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

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

相关内容