#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
Что делает ведущий ~
в начальном регулярном выражении?
#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
Что делает ведущий ~
в начальном регулярном выражении?
Ответы:
~
Фактически является частью оператора , =~
который выполняет регулярное выражение матч строки слева от нее к регулярному выражению справа.
[[ "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
имени массива происходит от «регулярного выражения», то есть «RE-Match».
В bash
оболочках, не похожих на Борн, можно также использовать expr
ограниченное сопоставление регулярных выражений (используя только базовые регулярные выражения).
Небольшой пример:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
grep -E
понимается только в системах GNU и только при использовании в качестве шаблона переменной без кавычек [[ $var = $pattern ]]
(см. [[ 'a b' =~ a\sb ]]
Vs p='a\sb'; [[ 'a b' =~ $p ]]
). Также следует помнить, что цитирование оболочки влияет на значение операторов RE и что некоторые символы необходимо заключать в кавычки для маркировки оболочки, что может повлиять на обработку RE. [[ '\' =~ [\/] ]]
возвращает ложь ksh93
имеет еще худшие проблемы. См. zsh
(Или bash 3.1) более разумный подход, в котором цитирование shell и RE четко разделено. [
Встроенный в zsh
а yash
также =~
оператор.
off-topic
! +1 (
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]
. Или что цитируемый *
тоже совпадает? [[ "This is a fine mess." =~ "T.........fin*es*" ]]
,
[[ a =~ .* ]]
или [[ a =~ '.*' ]]
или [[ a =~ \.\* ]]
, тот же .*
RE передается =~
оператору. OTH, in bash
, [[ '\' =~ [)] ]]
возвращает ошибку, знаете ли вы, не пробуя ее, [[ '\' =~ [\)] ]]
соответствует ли ? Как насчет [[ '\' =~ [\/] ]]
(это делает в ksh93). Как насчет c='a-z'; [[ a =~ ["$c"] ]]
(сравнить с =
оператором)? Смотрите также: [[ '\' =~ [^]"."] ]]
который возвращает ложное ... Обратите внимание , что вы можете сделать shopt -s compat31
в , bash
чтобы получить zsh
поведение.
zsh
/ bash -o compat31
Поведение «s для [[ a =~ '.*' ]]
также согласуется с [ a '=~' '.*' ]
(для [
реализаций, поддержки =~
) или expr a : '.*'
. OTOH, это не согласуется с [[ a = '*' ]]
vs [[ a = * ]]
(но в этом случае globs являются частью языка оболочки, а RE - нет).
Вы должны прочитать справочные страницы Bash, в [[ expression ]]
разделе.
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
Короче говоря, =~
оператор, так же, как ==
и !=
. Это не имеет никакого отношения к фактическому регулярному выражению в строке справа.
=~
в реальной жизни ...?
man [[ expresssion ]]
и man [[
ничего не вернуть. help [[
возвращает полезную информацию - начиная [[
с внутренней команды bash - но не говорит, =~
использует ли базовый или расширенный синтаксис регулярных выражений. Quoted Текст, который вы цитировали, взят со страницы руководства bash . Я понимаю, что вы сказали «читать страницы руководства bash», но сначала я подумал, что вы хотите прочитать страницы руководства внутри bash. В любом случае, man bash
возвращает огромный файл длиной 4139 строк (72 страницы). Его можно искать нажатием /▒▒▒
, которое принимает регулярное выражение, вкус которого, например =~
, не указан.