2013-10-15 4 views
5

FPAT 변수를 사용하여 데이터의 구분 기호를 처리 할 수 ​​있다는 것을 GNU page of GAWK에서 알 수 있었지만 어떻게 작동하는지는 알 수 없습니다. 포함 된 CSV 파일에 대한 FPAT 값은 다음과 같습니다 데이터가 다음 첫 번째 실패로 즉하지 쉼표,이 "abc"을해야awk FPAT 변수 : 작동

abc,"pqr,mno" 

첫 번째 그룹화 표현식은 모든 것을 평가 :

FPAT = "([^,]+)|(\"[^\"]+\")" 

이 데이터를 사용하여 쉼표가 나타납니다. 이제 내 질문은 다음에 무슨 일입니까? 첫 번째 그룹화 된 표현식이 실패했기 때문에 쉼표 뒤에 또는 조건을 사용하여 정규 표현식이 계속됩니다? 첫 번째 그룹화 된 표현식은 쉼표 뒤에 모든 데이터에 대해 계속 유효하므로 다음 데이터로 "pqr이 걸릴 수 있습니까?

답변

5

따라서 필드 패턴은 다음과 같이 설명됩니다.

문자열 길이가 쉼표를 포함하지 않는 문자열 제로보다 큰 (빈 문자열과 일치하지 않습니다) :

[^,]+ 

또는 시작하고 따옴표로 끝나는 적어도 포함하는 문자열 따옴표 아닌 하나 개의 문자가 (탈출 백 슬래시는 가독성을 위해 왼쪽으로) :

 
"[^"]+"  

정규 표현식 엔진 일치를 strin의 시작부터 g 패턴을 가능한 한 많이 맞추어보십시오.

abc,"pqr,mno" 

그래서 abc 문자열의 시작에서 하나의 패턴과 일치 긴 문자열 따라서 $1된다. 다음 문자 ,은 두 패턴 중 어느 것과도 일치 할 수 없으므로 정규 표현식 엔진이 두 번째 패턴과 일치하는 시작 문자 "으로 바로 이동합니다. "pqr,mno"은 큰 따옴표로 시작하고 끝나며 적어도 하나의 큰 따옴표가 아닌 문자를 포함하는 문자열이므로 줄 끝까지 일치시킵니다. 따라서 "pqr,mno"abc,"pqr,mno"의 경우 $2이됩니다.

+1

내 질문에 왜 정규 표현식은 두 번째 패턴으로 시작하겠습니까? ", 데이터는 쉼표가 아니기 때문에 항상 [^,]를 사용할 수 있습니다. regexp는 욕심이 많으므로 첫 번째 일치를 찾습니다. 가장 오래 갈 것입니까? – ghub24

+0

감사합니다. sudo_O, 많이 감사합니다. – ghub24

+0

@ user1844303 가장 길게 갈 것입니다. 쉬운 테스트는 2 개의 정규식의 순서를 전환하는 것입니다. –