[regex] AWK : 회선 패턴에서 캡처 된 그룹에 액세스

awk 명령이 있으면

pattern { ... }

패턴이 캡처 그룹을 사용하는 경우 블록에서 캡처 된 문자열에 어떻게 액세스 할 수 있습니까?



답변

그것은 기억의 길을 걷는 것입니다 …

오래 전에 awk를 perl로 바꿨습니다.

분명히 AWK 정규식 엔진은 그룹을 캡처하지 않습니다.

다음과 같은 것을 사용하는 것이 좋습니다.

perl -n -e'/test(\d+)/ && print $1'

-n 플래그는 perl이 awk처럼 모든 행을 반복하도록합니다.


답변

gawk를 사용하면 match 기능을 괄호로 묶은 그룹을 캡처 .

gawk 'match($0, pattern, ary) {print ary[1]}' 

예:

echo "abcdef" | gawk 'match($0, /b(.*)e/, a) {print a[1]}' 

출력 cd.

해당 기능을 구현하는 gawk의 특정 사용에 유의하십시오.

휴대용 대안을 당신이 유사한 결과를 얻을 수 있습니다 match()substr .

예:

echo "abcdef" | awk 'match($0, /b[^e]*/) {print substr($0, RSTART+1, RLENGTH-1)}'

출력 cd.


답변

이것은 항상 bash 함수를 만들기 위해 필요한 것입니다. 글렌 잭맨의 답변을 기반으로합니다.

정의

이것을 .bash_profile 등에 추가하십시오.

function regex { gawk 'match($0,/'$1'/, ary) {print ary['${2:-'0'}']}'; }

용법

파일의 각 줄에 대한 정규식 캡처

$ cat filename | regex '.*'

파일의 각 줄에 대한 첫 번째 정규식 캡처 그룹 캡처

$ cat filename | regex '(.*)' 1


답변

GNU awk를 사용할 수 있습니다 :

$ cat hta
RewriteCond %{HTTP_HOST} !^www\.mysite\.net$
RewriteRule (.*) http://www.mysite.net/$1 [R=301,L]

$ gawk 'match($0, /.*(http.*?)\$/, m) { print m[1]; }' < hta
http://www.mysite.net/


답변

확장없이 바닐라 awk에서도 캡처를 시뮬레이션 할 수 있습니다. 직관적이지 않습니다.

단계 1. gensub를 사용하여 문자열에 나타나지 않는 일부 문자와 일치하는 항목을 둘러싸십시오. 단계 2. 문자에 대해 split을 사용하십시오. 단계 3. 분리 된 어레이의 다른 모든 요소는 캡처 그룹입니다.

$ echo 'ab cb ad'| awk '{split (gensub (/ a ./, SUBSEP "&"SUBSEP, "g", $ 0), cap, SUBSEP); 프린트 캡 [2] "|" 캡 [4]; } '
ab | ad


답변

Peter Tillemans의 답변을 감싸는 bash 함수를 사용하여 조금 어려움을 겪었지만 여기에 내가 생각해 낸 내용이 있습니다.

정규식 함수 {perl -n -e “/ $ 1 / && printf \”% s \ n \ “,” ‘$ 1’}

“ms”를 인쇄하고 싶지 않기 때문에 다음 정규 표현식 인수에 대해 opsb의 awk 기반 bash 함수보다 더 효과적이라는 것을 알았습니다.

'([0-9]*)ms$'


답변