Регулярное выражение в grep не соответствует условному предложению?

#regex #grep

#регулярное выражение #grep

Вопрос:

Следующее регулярное выражение

  (created|modified|renamed) mode
  

При задании этих входных данных

созданный режим 123
создан sfs
abc
aasdf foobar
foo1  nfoo2

ВОЗВРАТ:

created mode как глобальное совпадение со следующими группами захвата.

введите описание изображения здесь

Как мне получить те же результаты при использовании grep ? Вот что происходит:

 echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep '(created|new file|modified) mode'
echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep '(created|new file|modified mode)'
echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep 'created|new file|modified mode'
created mode 123
 created sfs
  

Где только последнее grep (без () вокруг условия «или») возвращает результаты.

Я пробовал это как на macOS и ubuntu .

Обновление Пытается с grep -E

echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep -E '(created|new file|modified) mode'

Не дает результатов

Еще одно обновление, которое я пропустил в комментарии от @Barmar: необходимо отключить канал при использовании -E .

echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep -E '(created|new file|modified) mode'

[Правильно] дает

  created mode 123
  

Комментарии:

1. Пожалуйста, добавьте образец ввода (без описаний, без изображений, без ссылок) и желаемый результат для этого образца ввода в ваш вопрос (без комментариев).

2. Пример ввода показан в тексте . Вывод также должен быть понятным, но я добавлю текст в любом случае

3. Либо используйте grep -E и не экранируйте | , либо экранируйте ( и ) .

4. @Barmar grep -E не вернул никаких результатов, по крайней мере, на macos. Я также добавлю этот пример к вопросу

5. Вы читали, что я сказал? Если вы используете -E , вы НЕ выходите из каналов.

Ответ №1:

Если вы используете базовое регулярное выражение, вам ( также нужно экранировать | .

 echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep '(created|new|modified) mode'
  

Или вы можете использовать расширенное регулярное выражение с -E , тогда вы не должны экранировать ни одно из них.

 echo -e 'created mode 123n created sfsn abcn aasdf foobarn foo1nfoo2' | grep -E '(created|new|modified) mode'