Как grep regex1 ИЛИ regex2? - PullRequest
       6

Как grep regex1 ИЛИ regex2?

0 голосов
/ 26 марта 2019

Я бы хотел grep (на ubuntu18.04) каждую строку, которая соответствует шаблону, что «хотя бы одно из двух чисел больше 0».

Я нашел информацию о '|' использование в регулярных выражениях, но я вижу, что это не работает здесь.

Один из опробованных вариантов:

grep -E "Foo:[1-9]+ | Bar:[1-9]+" input

, который возвращает:

Foo:1, Bar:1
Foo:0, Bar:1

и это недопустимо, потому что оно соответствует только Bar:[1-9]+

Входные данные:

Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:0, Bar:0
Foo:55, Bar:0

Ожидаемый результат в решении:

Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:55, Bar:0

Ответы [ 2 ]

6 голосов
/ 26 марта 2019

Проблема заключается в пробеле после числа: в ваших входных данных такого пробела нет.

grep -E 'Foo:[1-9]|Bar:[1-9]'

дает ожидаемый результат.

Его можно еще более упростить до

grep -E '(Foo|Bar):[1-9]'

Обратите внимание, что + не требуется: число, начинающееся с 1-9, уже больше 0, даже если за ним следует 0 или вообще ничего.

0 голосов
/ 26 марта 2019

Помимо ответа great , предложенного choroba , где мы объединили все шаблоны в одном регулярном выражении, у вас есть два других способа сделать это, особенно если у вас есть многие шаблоны, объединяющие их в одном регулярном выражении, не могут быть оптимальным решением.

1) Использовать все шаблоны в командной строке :

grep -e 'Foo:[1-9]\+' -e 'Bar:[1-9]\+' input
Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:55, Bar:0

(обратите внимание, что вы должны экранировать + (\+), поскольку мы используем стандартное регулярное выражение POSIX)

2) Перегруппировать все шаблоны в один файл

$ cat patterns 
Foo:[1-9]\+
Bar:[1-9]\+
$ grep -f patterns input
Foo:1, Bar:0
Foo:1, Bar:1
Foo:0, Bar:1
Foo:55, Bar:0

или в конечном итоге

grep -f <(echo 'Foo:[1-9]\+'; echo 'Bar:[1-9]\+') input

если вы не хотите иметь файл.

То же самое замечание по поводу +: число, начинающееся с 1-9, уже больше 0, даже если за ним следует 0 или вообще ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...