문제에 대한 간략한 설명
문자열이 주어지면 정규식을 기반으로 여러 하위 문자열을 검색하는 방법은 무엇입니까?
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