2017-10-06 3 views
2

10 월 첫 주, Arnold Robbins는 gawk 4.2.0의 베타 버전을 GNU-announce, bug-gawk 및 comp.lang.awk 메일 링리스트에 현재으로 제공한다고 발표했습니다. http://www.skeeve.com/gawk/gawk-4.1.65.tar.gz 에서 사용할 수 있으며 그는 을 언급합니다.이 버전은 많은 중요한 새로운 기능이 포함 된 주요 릴리스입니다.. GNU Awk 4.2에서 FS = ""의 동작은 무엇입니까?

그래서 나는 이러한 기능으로 발굴하기 위해 NEWS 파일을 통해 가서 몇 가지 검사 할이 시점에서 중단 ...

변경 4.1.4에서 4.2.0

  1. 새 줄이 필드 구분 기호가 아닌 FS = ""인 경우 POSIX 표준의 수정은 POSIX 모드에 대한 특별한 경우를 제거합니다. 코드 과 doc가 업데이트되었습니다.

    'FS = "의 두 경우 사이에는 중요한 차이가있다"'(하나의 공간)와 'FS는 = "

내가 제대로 이해한다면, 그는 약 GNU Awk User's Guide → 4.5.2 Using Regular Expressions to Separate Fields 이야기 [\ t \ n] + " '(하나 이상의 공백, 탭 또는 개행과 일치하는 정규 표현식). FS의 두 값 모두에 대해 필드는 공백, TAB 및/또는 뉴 라인의 실행 (여러 번 인접한 경우)으로 구분됩니다. 그러나 FS의 값이 ""일 때 awk는 먼저 레코드의 앞뒤 공백을 제거한 다음 필드의 위치를 ​​결정합니다.

즉, FS = " "FS = "[ \t\n]+"을 사용하는 것의 차이입니다.

나는 새 버전을 실행하고 --posix 모드와 테스트 실행 :

$ ./gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are 
you" 
NR: 1 
1 hello 
2 how 
3 are 
NR: 2 
1 you 

을 그리고 내 이전 AWK (4.1.3)에 비해 어떤 차이 볼 수 없었다 :

$ gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are 
you" 
NR: 1 
1 hello 
2 how 
3 are 
NR: 2 
1 you 

을 모두 내 질문에 : FS = " "의 동작이 GNU Awk 4.2의 --posix 모드에서 어떻게 다른가요? 정확히 무엇이 변경 되었습니까?

1 예, 나는 또한 4.2.tar.gz해야한다 생각했지만, 그것은 오프 4.1라는 이름 때문에이 내장되어있어 4.2 베타 버전 /의

+0

궁금한데 ... 발표했지만 실현되지 않았습니까? – RomanPerekhrest

답변

2

http://www.skeeve.com/gawk/gawk-4.2.tar.gz 존재하지 않습니다. 그것이 공식 일 때 그것은 4.2.tar.gz 일 것이다.

나는 다음과 같은 이론을 테스트 할 4.2 베타 편리을 가지고 있지만 여기에 내가 기본 FS=" "에 대한 발표를 무엇을 생각하지 않는 것은 의미 필드로 구분 된 의미 POSIX에서 이전

당신이 FS=" " 설정 모든 공백 문자 (개행 문자 제외). gawk은 기본적으로 구분 기호 중 하나 인 개행 문자를 포함하고 POSIX 비헤이비어를 얻으려면 --posix를 추가해야했습니다.봐 :

$ gawk --version 
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2) 

$ printf 'a b\nc' | awk -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}' 
1 3 1 <a> 
1 3 2 <b> 
1 3 3 <c> 

$ printf 'a b\nc' | awk --posix -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}' 
1 2 1 <a> 
1 2 2 <b 
c> 

을 분명히 지금 POSIX 표준은 분리 문자의 집합에 \n을 포함하도록 업데이트되었습니다 FS=" " 그래서 더 이상 대신 모든 POSIX 비 POSIX 모드 대 POSIX에서 그 점에서 다르게 행동해야하고 둔한 없을 때 awks는 gawk가 기본적으로 수행 한 것처럼 작동하도록 업데이트해야합니다.

\n을 RS (기본값)로 사용하고 있으므로 \n이 레코드 내에있을 때 어떤 일이 발생하는지 테스트 할 수 없으므로이 예제에서는 테스트하지 않습니다. RS="^$"을 설정 한 후 다시 시도하십시오.

+0

그게 좋은 것입니다! 나는 몇몇 RS로 초기 테스트를했는데 마침내 그것이 필요하지 않다고 생각했다. – fedorqui

+1

다시 빛을 흘려 주셔서 감사합니다 !! – fedorqui

+0

반갑습니다. 제 대답의 이론을 테스트 해 보았습니까? 그것이 릴리스 노트의 의미는 무엇입니까? –

관련 문제