Совпадение с регулярным выражением 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
для деталей:
Разделение слов и расширение пути не выполняются над словами между [[и]]; Выполняется расширение тильды, расширение параметров и переменных, арифметическое расширение, подстановка команд, подстановка процессов и удаление кавычек.