Совпадение с регулярным выражением Bash не работает - экранирование всех специальных символов

У меня проблема с совпадением регулярных выражений bash. У меня есть регулярное выражение, как это:

re="fatal: file not found: .+/tmp_dir_1234/([^\ ]*) \(No such file or directory\)"
test="fatal: file not found: /some/path/irrelevant/something/tmp_dir_1234/somefile.txt (No such file or directory)"
if [[ "$test" =~ "$re" ]]; then
    echo "match!"
fi

Для меня сейчас все выглядит хорошо, но по какой-то причине во время отладки скрипта bash я вижу, что он не соответствует строке:

+ [[ fatal: file not found: /some/path/irrelevant/something/tmp_dir_1234/somefile.txt (No such file or directory) =~ fatal: file not found: \.\+/tmp_dir_1234/\(\[\^\\ ]\*\) \\\(No such file or directory\\\) ]]

По какой-то причине шаблон регулярных выражений не используется.

1 ответ

Удалите двойные кавычки из регулярного выражения в совпадении:

if [[ "$test" =~ $re ]]; then
    echo "match!"
fi

В двойных квадратных скобках нет необходимости заключать переменные в кавычки, так как они анализируются особым образом. Увидеть man bash для деталей:

Разделение слов и расширение пути не выполняются над словами между [[и]]; Выполняется расширение тильды, расширение параметров и переменных, арифметическое расширение, подстановка команд, подстановка процессов и удаление кавычек.

Другие вопросы по тегам