регулярное выражение bash с несколькими совпадениями

инструкции для определения того, какие пакеты [rpm] были установлены из какого репозитория из этого

Список всех пакетов RPM, установленных из репозитория «X»

Увидев amzn1 , я пришел к выводу, что у вас есть репозиторий Amazon Web Service (AWS )и вы установили кучу всего *amzn1.x86_64оттуда.

CentOS недавно обновился с 7.6 до 7.7, и, вероятно, репозиторий AWS конфликтует с CentOS 7.7.

Я не знаком с AWS и тем, что они могут предложить для Centos, но здесь проблема именно в них. Решение состоит в том, чтобы удалить все, что связано с amzn, и отключить их репозиторий вместе с любыми другими репозиториями, кроме базовых репозиториев CentOS и EPEL, это будет типичной процедурой, когда происходит что-то подобное... вернуться к работе системные базовые репозитории, пока из базового репозитория все не заработает должным образом. Неудивительно, поскольку некоторые другие репозитории для различных пакетов конфликтовали с обновлением Centos 7.7.

8
06.03.2021, 18:59
2 ответа

Это не поддерживается явно встроенным синтаксисом -в bash, но его можно легко реализовать с помощью небольшой подстановки переменных и некоторой рекурсии.

function do_something {
  echo $1 $2
}

function handlematches {
  regex='\((Closes|Resolves):\s([0-9]+)\)'
  msg=$1

  if [[ $msg =~ $regex ]] ; then
    action="${BASH_REMATCH[1]}"
    issue="${BASH_REMATCH[2]}"
    do_something "$action" "$issue"

    # Remove the first regex match and try again
    handlematches "${msg/${BASH_REMATCH[0]}/}"
  fi
}

message='Fixed a problem (Closes: 1234), (Resolves: 5678)'
handlematches "$message"

Выход:

Closes 1234
Resolves 5678
10
18.03.2021, 22:26

Аналогично ответу Стюарта , но с использованием итеративного, а не рекурсивного подхода:

regex='\((Closes|Resolves): ([0-9]+)\)'
msg='Fixed a problem (Closes: 1234), (Resolves: 5678)'

while [[ $msg =~ $regex ]]; do
        action=${BASH_REMATCH[1]}
        issue=${BASH_REMATCH[2]}
        do_something "$action" "$issue"

        msg=${msg/"${BASH_REMATCH[0]}"/}
done

Это перебирает строку в $msgдо тех пор, пока регулярное выражение не перестанет соответствовать. На каждой итерации соответствующий бит удаляется с помощью замены параметра bash.

Если вы хотите сохранить оригинал $msg, сначала сделайте его копию в другой переменной.

С

do_something () {
        printf 'action=%s, issue=%s\n' "$1" "$2"
}

этот вывод

action=Closes, issue=1234
action=Resolves, issue=5678
3
18.03.2021, 22:26

Теги

Похожие вопросы