2015-06-06 2 views
1

Часто мне приходится делать это с командной строкой, где я соединяю grep и хочу совпадения для двух разных выражений. (Совпадение A ИЛИ B.)Как сгладить два шаблона сразу

Например, я хочу, чтобы grep выводил результат generate_out для foo [0-9] + или bar [0-9] +. Я, конечно, мог бы просто выполнить дважды:

generate_out| grep "foo[0-9]+" 
generate_out| grep "bar[0-9]+" 

но часто generate_out дорого, и я предпочел бы не хотел, чтобы запустить его в два раза (или сохранить его вывод). Скорее всего, я хотел бы использовать только одно выражение:

generate_out| grep "foo[0-9]+ OR bar[0-9]+" 

, конечно, это не будет работать, но я хотел бы эквивалентное выражение, которое будет.

ответ

2

Используйте чередование в своем регулярном выражении:

generate_out | grep -E '(foo|bar)[0-9]+' 

Использование -E позволяет функцию ERE, это что один. (По умолчанию grep поддерживает только BRE, некоторые реализации BRE, такие как GNU, могут иметь специальный синтаксис для включения функций ERE; в случае с GNU \| в BRE эквивалентен | в ERE, однако он не переносится полагайтесь на такие расширения, а не на правильное включение ERE).


egrep является синонимом обратной совместимости для grep -E; однако only the latter is specified as a requirement by POSIX.

+0

ответ удалён, параллельная версия двух близких ответов: generate_out | egrep "foo [0-9] + | bar [0-9] +". –

2

Использование AWK для простоты:

generate_out| awk '/foo[0-9]+/ || /bar[0-9]+/' 

, которые, конечно, можно было бы упростить в данном конкретном случае:

generate_out| awk '/(foo|bar)[0-9]+/' 

, но в целом вы хотите использовать AWK для простых, последовательных OR с и AND s из регулярных выражений:

cmd | grep -E 'foo.*bar|bar.*foo' 
cmd | awk '/foo/ && /bar/' 

cmd | grep 'foo' | grep -v 'bar' 
cmd | awk '/foo/ && !/bar/' 

cmd | grep -E 'foo|bar' 
cmd | awk '/foo/ || /bar/'  (or awk '/foo|bar/') 

cmd | grep -E 'foo|bar' | grep -E -v 'foo.*bar|bar.*foo' 
cmd | awk '(/foo/ && !/bar/) || (/bar/ && !/foo/)' 
+1

Overkill для OP здесь, но другим людям, которые находят этот вопрос, скорее всего, понадобится этот более полный ответ (например, чтобы иметь возможность требовать множественные совпадения в пределах одной строки без учета их порядка - это допустимо с grep, когда только два значения, но необоснованные после этого), так что у меня есть мое преимущество. –

1

использование Grep-х -e возможность указывать несколько шаблонов, которые являются «OR'ed»:

$ seq 15 | grep -e 5 -e 3 
3 
5 
13 
15 
Смежные вопросы