регулярные - Unix grep regex, содержащий 'x', но не содержащий 'y'




grep регулярные выражения (4)

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

grep "alpha" | grep -v "beta"

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

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

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

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

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

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


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

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

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


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





regex-negation