1

Итак, я делаю это:

[[ 'Comment 1: abcas'  =~ '(?:Comment [0-9]*: )(.*)' ]]

Регулярное выражение прекрасно работает со многими онлайн-тестерами регулярных выражений и в js, но не работает в bash. В любом случае модификация моего регулярного выражения для извлечения abcas из

«Комментарий 1: abcas»

1 ответ1

1

Согласно руководству по Bash:

Доступен дополнительный бинарный оператор '= ~' с тем же приоритетом, что и '==' и '!знак равно Когда это используется, строка справа от оператора считается расширенным регулярным выражением и соответствует соответствующим образом (как в regex3)). Возвращаемое значение равно 0, если строка соответствует шаблону, и 1 в противном случае. Если регулярное выражение синтаксически неверно, возвращаемое значение условного выражения равно 2. Если включена опция оболочки nocasematch (см. Описание shopt в The Shopt Builtin), сопоставление выполняется без учета буквенных символов. Любая часть шаблона может быть заключена в кавычки, чтобы принудительно сопоставить указанную часть в виде строки.

Таким образом, ваши кавычки вокруг регулярного выражения приводят к тому, что все регулярное выражение рассматривается как простое совпадение строк. Кроме того, существует множество разновидностей регулярных выражений, и ?: Не поддерживается regex(3) - вам просто нужно просмотреть руководство, чтобы увидеть, какой аромат поддерживает какой-либо конкретный инструмент, к сожалению.

В вашем конкретном случае вы можете использовать что-то вроде

$ [[ 'Comment 1: abcas' =~ (Comment [0-9]*: )(.*) ]] && echo ${BASH_REMATCH[2]}
abcas

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .