스크립트 에서 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
비슷한 문제에 대한 해결책을 찾고 있다면 - ␣
OR 중 하나를 (
수행하십시오 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