Група захоплення регексу Bash


22

Я намагаюся зіставити декілька буквено-цифрових значень (це число може змінюватися) від рядка і зберегти їх у масиві групи захоплення башів. Однак я отримую лише перший матч:

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]}

Як бачите - воно відповідає першому значенню, яке я шукаю, але не другому.


1
Чи будете ви задоволені петельним переходом на вихід echo "$mystring1" | grep -oE '/instances/([A-Z0-9]+)'?
Джефф Шаллер

4
Напевно, варто згадати знаменитий Ви не можете проаналізувати HTML з регекс- постом
Цифрова травма

Відповіді:


22

Прикро, що ви не можете зробити глобальну відповідність в баші. Ви можете зробити це:

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

Це працює за допомогою відсікання відповідного префіксу з рядка, щоб наступна частина могла бути узгоджена. Він руйнує рядок, але у функції - це локальна змінна, тому хто дбає.

Я б фактично використовував цю функцію для заповнення масиву:

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

спасибі - це схоже на життєздатне рішення - лише те, що карта не існує в базі 3.2 ...
Артур Лисенко,

1
Дивіться на mywiki.wooledge.org/BashFAQ/001 про альтернативи
glenn jackman

6

Щоб отримати значення другого масиву, вам потрібно мати другий набір дужок в регулярному виразі:

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

Дякую, хто б я не шукав відповідати невідомої кількості можливих матчів.
Артур Лисенко

1
Я схвалив ваш Q, тому що я також очікував, що декілька збігів перейдуть до масиву, але вони, схоже, не будуть, якщо ви фактично не маєте декількох наборів дужок.
Джефф Шаллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.