#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'