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$'