Unix grep регулярное выражение, содержащее 'x', но не содержащее 'y' - PullRequest
46 голосов
/ 19 мая 2011

Мне нужно однопроходное регулярное выражение для unix grep, которое содержит, скажем, альфа, но не содержит бета.

grep 'alpha' <> | grep -v 'beta'

Ответы [ 5 ]

39 голосов
/ 20 мая 2011

Другие ответы здесь показывают некоторые способы, которыми вы можете исказить различные варианты регулярных выражений, чтобы сделать это, хотя я думаю, что получается, что ответ, как правило, «не делайте этого».Такие регулярные выражения гораздо сложнее для чтения и, вероятно, медленнее, чем просто объединение двух регулярных выражений с использованием логической логики любого языка, который вы используете.Если вы используете команду grep в приглашении оболочки Unix, просто перенаправьте результаты одного на другой:

grep "alpha" | grep -v "beta"

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

28 голосов
/ 19 мая 2011

Ну, так как мы все публикуем ответы, вот это в awk; -)

awk '/x/ && !/y/' infile

Надеюсь, это поможет.

19 голосов
/ 19 мая 2011

^((?!beta).)*alpha((?!beta).)*$ сделал бы трюк, я думаю.

3 голосов
/ 19 мая 2011

Я почти уверен, что это невозможно с настоящими регулярными выражениями.Пример [^y]*x[^y]* будет соответствовать yxy, поскольку * допускает ноль или более совпадений, отличных от y.

РЕДАКТИРОВАТЬ:

На самом деле, похоже, это работает: ^[^y]*x[^y]*$.По сути, это означает «соответствовать любой строке, которая начинается с нуля или более не-y символов, затем имеет символ x, а затем заканчивается нулем или более не-y символов».

0 голосов
/ 19 мая 2011

Попробуйте использовать оператор исключения: [^y]*x[^y]*

...