awk 명령이 있으면
pattern { ... }
패턴이 캡처 그룹을 사용하는 경우 블록에서 캡처 된 문자열에 어떻게 액세스 할 수 있습니까?
FS
) 를 조정하고 a와 일치시킬 항목을 선택할 수 $field
있습니다. 입력을 미리 포맷하면 도움이 될 수 있습니다.
gawk
(이것은 사용하기 때문에 gensub
).
awk 명령이 있으면
pattern { ... }
패턴이 캡처 그룹을 사용하는 경우 블록에서 캡처 된 문자열에 어떻게 액세스 할 수 있습니까?
FS
) 를 조정하고 a와 일치시킬 항목을 선택할 수 $field
있습니다. 입력을 미리 포맷하면 도움이 될 수 있습니다.
gawk
(이것은 사용하기 때문에 gensub
).
답변:
그것은 기억의 길을 걷는 것입니다 ...
오래 전에 awk를 perl로 바꿨습니다.
분명히 AWK 정규식 엔진은 그룹을 캡처하지 않습니다.
다음과 같은 것을 사용하는 것이 좋습니다.
perl -n -e'/test(\d+)/ && print $1'
-n 플래그는 perl이 awk처럼 모든 행을 반복하도록합니다.
gawk
! = awk
. 도구는 다르며 gawk
대부분의 경우 기본적으로 사용할 수 없습니다.
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
grep -o
다릅니 까?
grep -o
캡처 한 그룹을 출력 할 수 있습니까?
grep -o
.
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 'match($0, /.*(http.*?)\$/) { print substr($0,RSTART,RLENGTH) }'
RewriteRule (.*) 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
gensub
A는 gawk
특정 기능. awk --version
;-?) 를 입력하면 awk에서 무엇을 얻 습니까? 모두에게 행운을 빕니다.
echo 'ab cb ad' | awk '{gsub(/a./,SUBSEP"&"SUBSEP);split($0,cap,SUBSEP);print cap[2]"|"cap[4]}'
gawk --posix '{gensub(...)}'
.
gensub
기능을, 당신의 예는 매우 제한 시나리오에 적용 : 전체 패턴이 모두 같은 것을 일치하지 않을 수 있습니다, 그룹화 key=(value)
I 만 추출 할 때 value
부품.
Peter Tillemans의 답변을 감싸는 bash 함수를 사용하여 조금 어려움을 겪었지만 여기에 내가 생각해 낸 내용이 있습니다.
정규식 함수 {perl -n -e "/ $ 1 / && printf \"% s \ n \ "," '$ 1'}
"ms"를 인쇄하고 싶지 않기 때문에 다음 정규 표현식 인수에 대해 opsb의 awk 기반 bash 함수보다 더 효과적이라는 것을 알았습니다.
'([0-9]*)ms$'
$1
'([0-9]*)ms$'
-인수로 제공됩니까 (그리고 문자열은 다른 인수입니까)? 그리고의 출력은 perl -e
bash의 printf
명령 에 삽입되고 , 대체하기 위해 %s
맞습니까? 고마워, 나는 이것을 사용하기를 바라고있다.