2009-07-12 5 views
8

패턴이 한 줄로 여러 번 일치 할 때 모든 일치하는 그룹에서 작업을 수행하려면 어떻게합니까? awk 각 줄에서 여러 그룹 추출

내가 그들을 인쇄하기로 결정하는 경우 입력

abcHello! 200 300 Hello! Hello! 400z3 
ads 
Hello! 0 

, 내가 기대 때문에 내가 그들을 /Hello! (\d+)/ 검색하고 예를 들어, 숫자를 사용, 그들을 밖으로 인쇄하거나 합계를, 설명하기

200 
400 
0 
+0

을 : 일명, gawk''와 점에 유의. "GNU awk"를 사용하면 한 줄로 제목이 말한 것 (질문이 아님)을 실제로 할 수 있습니다 (예 : .Piping). gawk -v RS = ' "'{gensub (/()() /,"\\ 1 \\ 2 ","g ")를 인쇄하십시오. }':'D 이것은 ('-v RS = '''로 인해) 멀티 라인을 지원하고 (gawk의'gensub'를 사용하기 때문에) 서브 그룹을 일치시킨다 !!! – Andrew

답변

10

이 간단한 구문이며, 모든 AWK (nawk, mawk의가, 등, 둔한) : 레코드 구분 기호로 사용할 수 있습니다 및 줄 바꿈에 걸쳐 일치하지 않는 고정 된 텍스트가 없을 때 그것은 또한 패턴을 작동 이것을 사용할 수 있습니다.

{ 
    while (match($0, /Hello! [0-9]+/)) { 
     pattern = substr($0, RSTART, RLENGTH); 
     sub(/Hello! /, "", pattern); 
     print pattern; 
     $0 = substr($0, RSTART + RLENGTH); 
    } 
} 
1

GNU의 AWK의 출력

awk 'BEGIN{ RS="Hello! ";} 
{ 
    gsub(/[^0-9].*/,"",$1) 
    if ($1 != ""){ 
     print $1 
    } 
}' file 
+0

멋지지만/([a-g] + | [h-z] +) /와 같은 더 복잡한 패턴에는 사용할 수 없으며 줄 바꿈을 통해 일치합니다. –

+0

예제를 제공 할 수 있습니까? – ghostdog74

0

이있다 gawk 구문입니다.

{ 
    pattern = "([a-g]+|[h-z]+)" 
    while (match($0, pattern, arr)) 
    { 
     val = arr[1] 
     print val 
     sub(pattern, "") 
    } 
} 
0

동일한 패턴을 한 줄에 여러 번 일치시키는 gawk 기능이 없습니다. 패턴이 반복되는 횟수를 정확히 알지 못한다면

이렇게하면 같은 줄에있는 모든 일치 항목을 "수동으로"반복해야합니다. 귀하의 예를 입력의 경우, 그것은 다음과 같습니다 패턴이 라인 피드를 통해 일치하여야한다

{ 
    from = 0 
    pos = match($0, /Hello! ([0-9]+)/, val) 
    while(0 < pos) 
    { 
    print val[1] 
    from += pos + val[0, "length"] 
    pos = match(substr($0, from), /Hello! ([0-9]+)/, val) 
    } 
} 

경우, 입력 레코드 분리 수정해야 - Google 직원 RS