bash | регулярка
Пишу в баше регулярку. Есть место, где в строке может присутствовать маленькая латинская буква или m_. [a-z|m_] не подходит. А как тогда?
Ответы (1 шт):
Шаблон [a-z|m_] является "скобочным выражением" (bracket expression), который находит буквы из диапазона a-z, символ |, m или _. По сути, этот шаблон равен [_a-z|]. m_ не является здесь последовательностью символов.
Вы можете использовать [a-z]|m_, например
rx='[a-z]|m_'
if [[ $string =~ $rx ]]; then
echo "Найдено совпадение в ${string}";
else
echo "Совпадения не найдено в ${string}";
fi
Другой вариант: [[:lower:]]|m_.
Регулярные выражения в Bash должны следовать стандарту POSIX ERE, и приведённый выше шаблон означает следующее:
[[:lower:]]- буква в нижнем регистре|- оператор ИЛИm_- строкаm_.
В вашем более длинном регулярном выражении в grep нужно поместить [a-z]|m_ в группу (подмаску) ([a-z]|m_), иначе оператор ИЛИ "поделит" всё выражение на две альтернативные части:
grep -E '^[A-Z][0-9a-zA-Z]*\s+(a-z|m_)[0-9a-zA-Z]*;$' file