2012-03-28 2 views
3

awk가 문자 클래스를 어떻게 인식합니까?awk가 문자 클래스를 사용하도록하십시오.

이 :

echo "a\n1\nb\n2\nc" | awk '/1/' 

출력 예상 1 있지만 : I 필터 살아남 모두 12 예상

echo "a\n1\nb\n2\nc" | awk '/\d/' 

출력 아무것도.

이것은 쉘 이스케이프 (zsh)와 관련이 있다고 생각하지만 awk '/\\d/'도 작동하지 않습니다.

+0

이 질문에 감사드립니다. 나는 awk 1-liner가 왜 작동하지 않는지 알아 내려고 20 분을 보냈다. – Jamie

답변

7

당신 수 철자 아웃 문자 클래스 사용해보십시오 : \d 같은 표기가 실제로 대부분의 AWK 변종에 의해 이해 정규식 방언 ERE의 일부가 아닌 지금까지 내가 알고 있어요으로

[[email protected] ~]$ printf "a\n1\nb\n2\nc\n" | awk '/[[:digit:]]/' 
1 
2 
[[email protected] ~]$ 

을 (뿐만 아니라 The One True Awk).


UPDATE :

으로 댓글에서 지적되었다, 일부 리눅스 배포판 mawkawk로 가장 설치되어있을 수 있습니다. mawk는 awk와 동일하지 않습니다. 그것은 기능보다는 실행 속도를 위해 설계된 최소한의 기능을 갖춘 awk 복제본입니다. 그리고 그것은 확장 정규 표현식을 지원 claims in its man page에도 불구하고, mawk의가, [:digit:], [:upper:], [:lower:]처럼, POSIX "클래스"를 구현하기 위해 실패 등

당신이 표준 것들 대신에 mawk 같은 비표준 도구를 제공하는 시스템을 실행하는 경우, 재미있는 시간에 살기를 기대해야합니다. Awk 스크립트 개발자는 /usr/bin/awk의 바이너리가 awk처럼 작동 할 것으로 기대합니다. 그렇지 않으면 시스템이 고장났습니다.

+1

+1. '/ [0-9] /'도 사용할 수 있습니다. – ruakh

+0

@sierrasdetandil - 예,이 지역에서의 mawk의 설명 할 수없는 실패는 오랫동안 지속되어 왔으며 많은 수의 시도가있었습니다 (https://bugs.launchpad.net/ubuntu/+source/mawk/+bug/). 69724). 사용자를 속일 수있는 최선의 조언은 당신의 도구를 알고 있어야하고 regexes에서 POSIX 문자 클래스를 사용하는 것이 좋다면 mawk를 사용하지 말라. – ghoti

+0

사실, POSIX 문자 클래스 (즉, [[: digit :]])는 mawk <1.3.4에서 작동하지 않으며, 많은 배포판은 현재 1.3.3 (최신 데비안, 데비안, 우분투, 맨드리바 확인)과 함께 제공됩니다. 참고 : [mawk : POSIX 스타일의 문자 클래스를 구현하십시오.] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=65617); [Mawk는 표현에서 Posix 문자 클래스를 지원하지 않습니다.] (https://bugs.launchpad.net/ubuntu/+source/mawk/+bug/69724); http://unix.stackexchange.com/a/149059/29395. – sierrasdetandil

관련 문제