Nhóm chụp regex Bash


22

Tôi đang cố gắng khớp nhiều giá trị chữ và số (số này có thể thay đổi) từ một chuỗi và lưu chúng vào mảng nhóm chụp bash. Tuy nhiên, tôi chỉ nhận được trận đấu đầu tiên:

mystring1='<link rel="self" href="/unix//api/clouds/1/instances/1BBBBBB"/> dsf <link rel="self" href="/unix//api/clouds/1/instances/2AAAAAAA"/>'

regex='/instances/([A-Z0-9]+)'

[[ $mystring1 =~ $regex ]]

echo ${BASH_REMATCH[1]}
1BBBBBB

echo ${BASH_REMATCH[2]}

Như bạn có thể thấy - nó khớp với giá trị đầu tiên tôi đang tìm, nhưng không phải giá trị thứ hai.


1
Bạn sẽ hài lòng với việc lặp qua đầu ra của echo "$mystring1" | grep -oE '/instances/([A-Z0-9]+)'?
Jeff Schaller

4
Có lẽ đáng để đề cập đến sự nổi tiếng Bạn không thể phân tích HTML bằng bài đăng regex .
Chấn thương kỹ thuật số

Câu trả lời:


22

Thật xấu hổ khi bạn không thể thực hiện kết hợp toàn cầu trong bash. Bạn có thể làm được việc này:

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" 
1BBBBBB
2AAAAAAA

Điều này hoạt động bằng cách cắt tiền tố phù hợp ra khỏi chuỗi để phần tiếp theo có thể được khớp. Nó phá hủy chuỗi, nhưng trong hàm nó là một biến cục bộ, vì vậy ai quan tâm.

Tôi thực sự sẽ sử dụng chức năng đó để điền vào một mảng:

$ mapfile -t matches < <( global_rematch "$mystring1" "$regex" )
$ printf "%s\n" "${matches[@]}"
1BBBBBB
2AAAAAAA

thanks- vẻ này như một vấn đề duy nhất solution- khả thi được mapfile không tồn tại trong bash 3.2 ...
Arthur Lyssenko

1
Xem mywiki.wooledge.org/BashFAQ/001 giải pháp thay thế
glenn Jackman

6

Để có được giá trị mảng thứ hai, bạn cần có một bộ dấu ngoặc đơn thứ hai trong biểu thức chính quy:

mystring1='<link rel="self" href="/unix//api/clouds/1/instances/1BBBBBB"/> dsf <link rel="self" href="/unix//api/clouds/1/instances/2AAAAAAA"/>'

regex='/instances/([A-Z0-9]+).*/instances/([A-Z0-9]+)'

[[ $mystring1 =~ $regex ]]

$ echo ${BASH_REMATCH[1]}
1BBBBBB
$ echo ${BASH_REMATCH[2]}
2AAAAAAA

Cảm ơn, dù sao tôi cũng đang tìm kiếm một số trận đấu không xác định.
Arthur Lyssenko

1
Tôi đã nâng cấp Q của bạn vì tôi cũng mong đợi nhiều trận đấu sẽ đi vào mảng, nhưng dường như chúng không, trừ khi bạn thực sự có nhiều bộ dấu ngoặc.
Jeff Schaller
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.