Использование регулярных выражений внутри предложения if в bash


10

Посмотрите на это, если блок:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0

Это должно напечатать "совпало", но это не так. Куда я иду не так?

Ответы:


21

Вы должны удалить цитату в регулярном выражении.

if [[ ${str} =~ m\.m ]]; then

Со страницы руководства bash:

[...] Доступен дополнительный двоичный оператор = ~, имеющий тот же приоритет, что и == и! =. Когда она используется, строка справа от оператора считается расширенным регулярным выражением и сопоставляется соответствующим образом (как в регулярном выражении (3)). Возвращаемое значение равно 0, если строка соответствует шаблону, и 1 в противном случае. Если регулярное выражение синтаксически неверно, возвращаемое значение условного выражения равно 2. Если включена опция оболочки nocasematch, сопоставление выполняется без учета буквенных символов. Любая часть шаблона может быть заключена в кавычки, чтобы ее можно было сопоставить как строку.

Таким образом, в кавычках вы используете старое доброе совпадение строк.

Если вам нужны пробелы в шаблоне, просто избегайте их:

str="m   m"
if [[ ${str} =~ m\ +m ]]; then

но без двойных кавычек мы не можем использовать пробел в регулярных выражениях. Есть ли решение для этого?
Маджид Азими

1
Пространство должно быть экранировано, как \ .
ДМИТРИЙ МАЛИКОВ

Если я хочу найти строку, которая заканчивается динамическим числом, следует использовать ${str} =~ "needle"[0-9]{1}или я должен использовать ${str} =~ needle[0-9]{1}?
19
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.