bash regex с кавычками?
следующий код
number=1
if [[ $number =~ [0-9] ]]
then
echo matched
fi
строительство. Если я попытаюсь использовать кавычки в регулярном выражении, однако, он останавливается:
number=1
if [[ $number =~ "[0-9]" ]]
then
echo matched
fi
пробовал "[0-9]"
тоже. Чего мне не хватает?
как ни странно, bash advanced scripting guide предполагает, что это должно работать.
Bash версия 3.2.39.
4 ответа:
Это был изменен между 3.1 и 3.2. Угадайте, что расширенное руководство нуждается в обновлении.
Это краткое описание нового особенности добавлены в bash-3.2 с момента выпуск bash-3.1. Как всегда, страница руководства (doc / bash.1) место искать полные описания.
- новые возможности в Bash
СНиП
f. цитирование строкового аргумента [[ команда =~ оператор теперь силы сопоставление строк, как и с другими операторами сопоставления шаблонов.
к сожалению, это сломает существующую цитату с помощью скриптов, если у вас не было понимания, чтобы хранить шаблоны в переменных и использовать их вместо регулярных выражений напрямую. Пример ниже.
$ bash --version GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc. $ number=2 $ if [[ $number =~ "[0-9]" ]]; then echo match; fi $ if [[ $number =~ [0-9] ]]; then echo match; fi match $ re="[0-9]" $ if [[ $number =~ $re ]]; then echo MATCH; fi MATCH $ bash --version GNU bash, version 3.00.0(1)-release (i586-suse-linux) Copyright (C) 2004 Free Software Foundation, Inc. $ number=2 $ if [[ $number =~ "[0-9]" ]]; then echo match; fi match $ if [[ "$number" =~ [0-9] ]]; then echo match; fi match
Bash 3.2 представил параметр совместимости compat31, который возвращает регулярное выражение bash, цитирующее поведение, обратно в 3.1
без compat31:
$ shopt -u compat31 $ shopt compat31 compat31 off $ set -x $ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi + [[ 9 =~ \[0-9] ]] + echo no match no match
С compat31:
$ shopt -s compat31 + shopt -s compat31 $ if [[ "9" =~ "[0-9]" ]]; then echo match; else echo no match; fi + [[ 9 =~ [0-9] ]] + echo match match
ссылка на патч: http://ftp.gnu.org/gnu/bash/bash-3.2-patches/bash32-039
GNU bash, версия 4.2.25 (1)-release (x86_64-pc-linux-gnu)
некоторые примеры соответствия строк и регулярных выражений
$ if [[ 234 =~ "[0-9]" ]]; then echo matches; fi # string match $ $ if [[ 234 =~ [0-9] ]]; then echo matches; fi # regex natch matches $ var="[0-9]" $ if [[ 234 =~ $var ]]; then echo matches; fi # regex match matches $ if [[ 234 =~ "$var" ]]; then echo matches; fi # string match after substituting $var as [0-9] $ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match after substituting $var as [0-9] $ if [[ 'rss$var919' =~ $var ]]; then echo matches; fi # regex match after substituting $var as [0-9] matches $ if [[ "rss$var919" =~ "$var" ]]; then echo matches; fi # string match won't work $ if [[ "rss\$var919" =~ "$var" ]]; then echo matches; fi # string match won't work $ if [[ "rss'$var'""919" =~ "$var" ]]; then echo matches; fi # $var is substituted on LHS & RHS and then string match happens matches $ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match ! matches $ if [[ 'rss$var919' =~ "$var" ]]; then echo matches; fi # string match failed $ $ if [[ 'rss$var919' =~ '$var' ]]; then echo matches; fi # string match matches $ echo $var [0-9] $ $ if [[ abc123def =~ "[0-9]" ]]; then echo matches; fi $ if [[ abc123def =~ [0-9] ]]; then echo matches; fi matches $ if [[ 'rss$var919' =~ '$var' ]]; then echo matches; fi # string match due to single quotes on RHS $var matches $var matches $ if [[ 'rss$var919' =~ $var ]]; then echo matches; fi # Regex match matches $ if [[ 'rss$var' =~ $var ]]; then echo matches; fi # Above e.g. really is regex match and not string match $ $ if [[ 'rss$var919[0-9]' =~ "$var" ]]; then echo matches; fi # string match RHS substituted and then matched matches $ if [[ 'rss$var919' =~ "'$var'" ]]; then echo matches; fi # trying to string match '$var' fails $ if [[ '$var' =~ "'$var'" ]]; then echo matches; fi # string match still fails as single quotes are omitted on RHS $ if [[ \'$var\' =~ "'$var'" ]]; then echo matches; fi # this string match works as single quotes are included now on RHS matches
Как уже упоминалось в других ответах, помещение регулярного выражения в переменную является общим способом достижения совместимости по разным Баш версий. Вы также можете использовать этот обходной путь для достижения того же самого, сохраняя регулярное выражение в условном выражении:
$ number=1 $ if [[ $number =~ $(echo "[0-9]") ]]; then echo matched; fi matched $