정규식의 다양한 결과(grep 사용)를 변수로 검색하려면 어떻게 해야 합니까?

정규식의 다양한 결과(grep 사용)를 변수로 검색하려면 어떻게 해야 합니까?

문제에 대한 간략한 설명

문자열이 주어지면 정규식을 기반으로 여러 하위 문자열을 검색하는 방법은 무엇입니까?

echo "hello world 15 42" | grep -P ".*([0-9]+) ([0-9]+)";

불행하게도 이는 각각 15와 42 대신 완전히 일치하는 문자열을 반환합니다. 이상적으로 일부 변수는 이를 복원하여 사용할 수 있게 합니다.

echo "First: $0, Second: $1"; # echo is only an example

더 많은 맥락

설치 스크립트의 경우 URL에서 해당 파일을 다운로드 받아야 하는데(wget 이용), 구체적인 파일명은 알 수 없으므로 스크립트는 먼저 index.html을 다운로드하여 파일명 추출, 버전 번호 추출 및 재구성을 해야 합니다. 전체 URL.

wget 2>/dev/null -O - http://...../directory/ | grep -P "<a href=....
wget "http://..../directory/file-$1-revision-$2.gz" -O downloaded.gz

답변1

Bash 정규식을 사용하여 내장 BASH_REMATCH 배열을 일치시키고 액세스합니다.

s="hello world 15 42"
re='.*([0-9]+) ([0-9-]+)'
if [[ $s =~ $re ]]; then
    for key in "${!BASH_REMATCH[@]}"; do 
        printf "%s\t%s\n" "$key" "${BASH_REMATCH[$key]}"
    done
fi
0   hello world 15 42
1   5
2   42

답변2

> greparray=($(echo "hello world 15 42" | grep -Eo "[0-9]+ [0-9]+"))
> echo ${greparray[1]}
42

답변3

배열을 사용하겠습니다.

myArray=($(echo "hello world 15 42" | egrep -o '([0-9]+)'))

첫 번째 하위 문자열에 액세스합니다.

echo ${myArray[0]}
15

...두번째:

echo ${myArray[1]}
42

관련 정보