#regex #linux #bash #shell #grep
Вопрос:
Это была моя попытка:
grep -i 'th[D]{1,}'
Я на хакеррАнке. У меня есть этот файл, который доставлен в мой stdin.
Мне нужны в результате строки, которые содержат :
the
that
then
those
Комментарии:
1. Существует много разных диалектов регулярных выражений, и вы используете неправильный.
grep
использует «Базовое регулярное выражение Posix (BRE)», а не «Регулярное выражение, совместимое с Perl (PCRE)», которое вы, похоже, используете2. С помощью BRE вы можете писать
[D]
как[^[:digit:]]
для «без цифр».3. Если вы используете GNU grep, вы можете использовать
-P
опцию использования PCRE.4. Как вам пришло в голову это регулярное выражение? Это очень необычно для цели, которую вы описали. Разве это не
the|that|then|those
был бы очевидный путь?5. @Ayoub_Prog: Смотрите здесь допустимый синтаксис базового регулярного выражения. Вы увидите, что его нет
D
в наличии.
Ответ №1:
В шаблоне POSIX BRE, когда вы используете «класс сокращенных символов» s
, например w
, даже в GNU grep
, эти escape-последовательности рассматриваются как отдельные символы, обратная косая черта и буква. [D]{1,}
соответствует одной или нескольким D
буквам или
символам.
Вам нужно точно соответствовать словам, которые вам говорят:
grep -i -E '<(the|that|then|those)>'
Здесь,
-i
— позволяет сопоставлять без учета регистра-E
— включает синтаксис POSIX ERE<
— откройте границу слова(the|that|then|those)
— группа захвата s, соответствующая любому слову между|
(ИЛИ) операторами чередования>
— закрыть границу слов.
Комментарии:
1. команда grep по умолчанию использует POSIX BRE, а фигурные скобки {} поддерживаются ERE not BRE, не означает ли это, что вы должны добавить опцию-E для использования ERE вместо этого ?
2. @Ayoub_Prog Если мы добавим
-E
, это будет выглядеть такgrep -i -oE '<th[[:alpha:]] ' file
3. @Ayoub_Prog наконец-то это сработало для тебя?
4. @Ayoub_Prog Я обновил рабочий шаблон.
5. @Bohemian Это хакерское упражнение, которое
grep -i -E '<th[a-z] '
вызывает «Неправильный ответ :(» ответ.grep -i -E '<th(e|at|en|ose)>'
это то же самое регулярное выражение, что и у меня, только переработанное, чтобы быть менее читаемым.