gawk에서 ~ 연산자 왼쪽에 상수 정규식을 넣을 수 없는 이유는 무엇입니까?

gawk에서 ~ 연산자 왼쪽에 상수 정규식을 넣을 수 없는 이유는 무엇입니까?

gawk를 사용할 때 ~ 연산자 왼쪽에 정규식을 넣을 수 없는 이유는 무엇입니까?

예를 들어 다음 파일에서는 필드가 탭(\t)으로 구분됩니다.

$ cat cats
siberian    1970    73  2500
shorthair   1999    60  3000
longhair    1998    102 9859
scottish    2001    30  6000

gawk를 사용하여 레코드를 찾으면 작동합니다.

$ gawk '$1 ~ /h/' cats
shorthair   1999    60  3000
longhair    1998    102 9859
scottish    2001    30  6000

그러나 피연산자 $1과 /h/를 이동하면 다음과 같은 결과가 발생하지 않습니다.

$ gawk '/h/ ~ $1' cats
gawk: cmd. line:1: warning: regular expression on left of `~' or `!~' operator

~ 연산자에 대한 gawk 매뉴얼 페이지는 다음과 같이 말합니다:

정규식 일치, 부정 일치. 참고: ~ 또는 !~의 왼쪽에는 상수 정규식(/foo/)을 사용하지 마십시오. 오른쪽에만 사용됩니다. /foo/ ~ exp 표현은 (($0 ~ /foo/) ~ exp)와 같은 의미를 갖습니다. 이는 일반적으로 예상되지 않습니다.

/foo/ 표현이 ($0 ~ /foo/) 로 평가되는 방식을 이해하지 못합니다. 이는 "왼쪽에 상수 정규 표현식을 넣으면 나쁜 일이 일어날 것입니다"라는 약한 문구만 의미하는 것 같습니다. 실제로 "왼쪽에 상수 정규 표현식을 넣으면 gawk의 동작이 정의되지 않습니다. 그런 식으로 사용되도록 프로그래밍되지 않았기 때문입니다"라는 의미는 아닙니다.

기본적으로 ~ 연산자가 내부적으로 어떻게 평가되는지 이해하지 못합니다.

답변1

awk에 대한 POSIX 사양을 인용하면 다음과 같습니다.

~ERE 토큰이 or 연산자의 오른쪽 !~이나 아래에 설명된 내장 함수 인수 중 하나가 아닌 다른 컨텍스트에서 표현식으로 나타나는 경우 결과 표현식의 값은 다음과 같습니다.

$0 ~ /ere/

이것이(기본값으로 설정된 작업과 결합됨 { print }) 실행을 대체용으로 사용할 수 있는 이유입니다 awk.grepawk '/b/' <file

따라서 대답은 간단히 "이런 식으로 작동하도록 정의되었습니다"입니다. 는 특정 상황을 제외 /ere/한다고 정의되어 있으며 , 특별한 경우가 아니므로 로 평가됩니다 .$0 ~ /ere//ere/ ~ $1($0 ~ /ere/) ~ $1

관련 정보