Подивіться на це, якщо блок:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Це має друкуватися "зіставленим", але це не так. Де я помиляюся?
Подивіться на це, якщо блок:
#!/bin/bash
str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
exit 0
Це має друкуватися "зіставленим", але це не так. Де я помиляюся?
Відповіді:
Вам потрібно видалити цитування в збігу регулярних виразів.
if [[ ${str} =~ m\.m ]]; then
З сторінки "bash man":
[...] Доступний додатковий бінарний оператор, = ~, з тим самим пріоритетом, що і == та! =. Коли він використовується, рядок праворуч від оператора вважається розширеним регулярним виразом і відповідно відповідає (як у регулярному вираженні (3)). Повернене значення дорівнює 0, якщо рядок відповідає шаблону, а 1 - в іншому випадку. Якщо регулярний вираз синтаксично невірний, повернене значення умовного виразу дорівнює 2. Якщо опція оболонки включена nocasematch, збіг виконується без урахування випадку алфавітних символів. Будь-яка частина шаблону може бути процитована, щоб змусити його відповідати як рядок.
Тож у котируваннях ви використовуєте старі добрі відповідність рядків.
Якщо вам потрібні пробіли в шаблоні, просто уникайте їх:
str="m m"
if [[ ${str} =~ m\ +m ]]; then
\
.
${str} =~ "needle"[0-9]{1}
або я повинен використовувати ${str} =~ needle[0-9]{1}
?