bash | регулярка

Пишу в баше регулярку. Есть место, где в строке может присутствовать маленькая латинская буква или m_. [a-z|m_] не подходит. А как тогда?


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Шаблон [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
→ Ссылка