6

В сценарии awk я пытаюсь использовать '(' в качестве разделителя полей. Однако, если я не уйду в скобки с двойной обратной косой чертой, вот так:

BEGIN {FS=" \\("}

это не работает.

Если я использую FS=" \(" я получаю

awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/

выходной, и если я не уйти от кронштейна вообще, я получаю только

awk: prog:2: fatal: :, [., or [=: / (/ message).

Можете ли вы объяснить это поведение?

1 ответ1

7

Чтобы использовать ␣( (пробел + скобки) в качестве разделителя полей в 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 - это один символ, он не рассматривается как регулярное выражение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .