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