awk 문자 클래스의 미스터리

awk 문자 클래스의 미스터리

문자 클래스를 사용할 수 없는 것 같습니다.설명과 거의 똑같은 정규 표현식여기:

user@host:~$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040
user@host:~$ echo "host.company.com has address 192.168.22.82" |awk '/^[a-zA-Z0-9.-]+ has address/ { print $4 }'
192.168.22.82
user@host:~$ echo "host.company.com has address 192.168.22.82" |awk '/^[[:alnum:].-]+ has address/ { print $4 }'
user@host:~$

두 번째 명령이 주소 필드를 찾을 수 없는 이유를 아는 사람이 있습니까?

답변1

이것은 버그 mawk 1.3.3이며 보고되었습니다.여기. 업그레이드 mawk 1.3.4하거나 패치를 사용하여 이 오류를 해결할 수 있습니다.

$ mawk -W version
mawk 1.3.4 20130219
Copyright 2013, Thomas E. Dickey
Copyright 1996, Michael D. Brennan

internal regex
compiled limits:
max NF             32767
sprintf buffer      2040

$ echo "host.company.com has address 192.168.22.82" | mawk '/^[[:alnum:].-]+ has address/ { print $4 }'
192.168.22.82

mawk마찬가지로 확장 정규 표현식이 사용되므로 egrepPOSIX 문자 클래스를 지원해야 합니다.

답변2

당신이 참조하는 문서는 GNU 버전에 대한 것이지만 Awk, 당신이 가지고 있는 버전은(첫 번째 명령에서 볼 수 있듯이) 이것은 awkPOSIX 문자 클래스(예: 또는 )를 지원하지 않는 [:alpha:]변형 입니다 [:alnum:].

편집 : 같이Gnouc이 언급한, mawkPOSIX 문자 클래스는 버전 1부터 지원되므로 1.3.4업데이트로 문제가 해결될 수도 있습니다.

답변3

gawk 대 mawk POSIX 클래스에 대해서는 다른 클래스에 대해서는 말할 수 없지만 이상하게도 클래스 측면에서는 mawk 1.3.4만 올바른 것 같습니다.

[[:graph:]]

나는 더 오래되고 난독화된 변형을 테스트하지 않았지만 gawk 5.1과 mawk2-beta는 이 특정 클래스에서 서로 일치하며 둘 다 한국어 한글과 중국어 한자의 인쇄 가능한 문자가 일부 누락되었습니다. 다음과 같은 일을 해라

/[[:graph:]]|[\352\353\354]/

최대작동하지만 공백을 설명하기 위해 깨끗한 정규식을 작성할 수 있는 식별 가능한 패턴 없이 \355에 여전히 일부 잔차가 있습니다. 나는 GNU 코드 관리자들이 이 작업을 수행할 시간을 찾기를 기도할 뿐이지만, 이것이 누군가의 우선 순위 목록에서 매우 낮을 수도 있다는 현실도 인식하고 있습니다.

관련 정보