Використання регулярного вираження всередині, якщо в базі застереження


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 man":

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

Тож у котируваннях ви використовуєте старі добрі відповідність рядків.

Якщо вам потрібні пробіли в шаблоні, просто уникайте їх:

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

але, не маючи подвійної лапки, ми не можемо використовувати символи пробілу в шаблоні регулярних виразів. Чи є для цього рішення?
Маджід Азімі

1
Космос слід уникати, як \ .
ДМИТРІЙ МАЛИКОВ

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