~
фактически является частью оператора = ~
, который выполняет сопоставление строки с регулярным выражением слева от расширенного регулярного выражения справа.
[[ "string" =~ pattern ]]
Обратите внимание, что строка должна быть заключена в кавычки, а регулярное выражение - в кавычки.
Аналогичный оператор используется в языке программирования Perl.
Регулярные выражения, понимаемые bash
, такие же, как и те, которые понимает GNU grep
с флагом -E
, то есть расширенным набором регулярных выражений.
Скорее не по теме, но полезно знать:
При сопоставлении с регулярным выражением, содержащим группы захвата, часть строки, захваченная каждой группой, доступна в массиве BASH_REMATCH
. Нулевой / первый элемент в этом массиве соответствует &
в шаблоне замены команды подстановки sed
(или $ &
в Perl), что является бит строки, который соответствует шаблону, в то время как записи с индексом 1 и далее соответствуют \ 1
, \ 2
и т. д. в шаблоне замены sed
(или $ 1
, $ 2
и т. д. в Perl), то есть биты, соответствующие каждой круглой скобке.
Пример:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
Может вывести
Got 09, 19 and 14
, если текущее время 09:19:14.
Бит REMATCH
имени массива BASH_REMATCH
происходит от «Соответствие регулярного выражения», то есть «Повторное сопоставление».
В оболочках, отличных от bash
Борна, можно также использовать expr
для ограниченного сопоставления регулярных выражений (с использованием только базовых регулярных выражений).
Небольшой пример:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123