Можно ли сделать OR в регулярном выражении bash? - PullRequest
1 голос
/ 04 июня 2019

Я знаю, что могу использовать grep, awk и т. Д., Но у меня есть большой набор скриптов bash, в которых есть некоторые условные операторы, использующие =~, например:

#works
if [[ "bar" =~ "bar" ]]; then echo "match"; fi

Если я попытаюсь получить егосделать логическое ИЛИ, я не могу заставить его соответствовать:

#doesn't work
if [[ "bar" =~ "foo|bar" ]]; then echo "match"; fi

или, возможно, это ...

#doesn't work
if [[ "bar" =~ "foo\|bar" ]]; then echo "match"; fi

Возможно ли получить логическое ИЛИ, используя =~или я должен переключиться на grep?

1 Ответ

5 голосов
/ 04 июня 2019

Вам не нужен оператор регулярных выражений для альтернативного сопоставления.Оператор расширенного теста [[ позволяет использовать расширенное сопоставление с шаблоном , используя который вы можете просто сделать ниже.+(pattern-list) предоставляет способ сопоставления еще одного числа шаблонов, разделенных |

[[ bar == +(foo|bar) ]] && echo match

. Расширенные правила глобализации применяются автоматически, когда ключевое слово [[ используется с оператором ==.

Что касается части регулярных выражений, то с помощью любой команды, поддерживающей библиотеку ERE, можно просто выполнить чередование с помощью конструкции | как

[[ bar =~ foo|bar ]] && echo ok
[[ bar =~ ^(foo|bar)$ ]] && echo ok

Что касается вашего регулярного выражения в кавычкахработа заключается в том, что разбор регулярных выражений в bash изменился между выпусками 3.1 и 3.2.До 3.2 было безопасно свернуть ваш шаблон регулярных выражений в кавычки, но это изменилось в 3.2.С тех пор регулярное выражение всегда должно быть без кавычек.

Вы должны защищать любые специальные символы, экранируя их с помощью обратной косой черты.Лучший способ всегда быть совместимым состоит в том, чтобы поместить свое регулярное выражение в переменную и развернуть эту переменную в [[ без кавычек.Также см. FAQ Чета Рами по Bash, раздел E14 , который очень хорошо объясняет это поведение при цитировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...