정규식 일치에서 캡처 그룹의 여러 항목을 추출하는 방법은 무엇입니까?

정규식 일치에서 캡처 그룹의 여러 항목을 추출하는 방법은 무엇입니까?

일치해야 하는 다음 형식의 문자열이 있습니다.

./foo/baz/bar/filename.c

내 정규식은 다음과 같습니다

  regex=$'^(\./)?([a-zA-Z0-9_-]+/)+([a-zA-Z0-9_-]+\.[a-z]+)$'

테스트는 다음과 같습니다

[[ $search =~ $regex ]]

존재하다이것스레드에 흥미로운 코드가 있습니다.코드 예사용자 예글렌 잭맨동일한 캡처 그룹의 반복 발생을 캡처하려면

global_rematch() { 
    local s=$1 regex=$2 
    while [[ $s =~ $regex ]]; do 
        echo "${BASH_REMATCH[1]}"
        s=${s#*"${BASH_REMATCH[1]}"}
    done
}
global_rematch "$mystring1" "$regex" 

하지만 정규식에는 다음과 같은 것이 있습니다.하나캡처 그룹.내 거여기서는 상황이 조금 다릅니다.

내 $regex는 캡처 그룹의 여러 항목을 추출하려고 시도합니다. 그러나 캡처 그룹은 느리게 처리되며(또는 여기서 올바른 용어는 무엇입니까?? global matching) 첫 번째 항목만 출력합니다. 다른 모든 것은 폐기됩니다.

$ printf "%s\n" "${BASH_REMATCH[@]}"
./foo/baz/bar/filename.c
./
bar/
filename.c

괄호를 하나 더 추가해야만 모든 이벤트가 출력되는데, 제가 원하는 결과는 아닙니다.

regex=$'^(\./)?(([a-zA-Z0-9_-]+/)+)([a-zA-Z0-9_-]+\.[a-z]+)$'

밝혀지다

echo "${BASH_REMATCH[2]}"
foo/baz/bar/

BASH_REMATCH반복되는 모든 항목이 자체 인덱스에 의해 저장되도록 위의 코드 예제나 다른 솔루션을 적용하는 방법이 있습니까?

그러면 인덱스는 다음과 같이 표시됩니다.

echo "${BASH_REMATCH[2]}"
./foo/baz/bar/filename.c
echo "${BASH_REMATCH[1]}"
./
echo "${BASH_REMATCH[2]}"
foo/
echo "${BASH_REMATCH[3]}"
baz/
echo "${BASH_REMATCH[4]}"
bar/
echo "${BASH_REMATCH[5]}"
filename.c

어쩌면 캡처 그룹이 하나만 있는 두 개의 패턴 일치를 실행해야 할 수도 있습니다. 해결 방법으로.

관련 정보