Подтвердить что ты не робот

Unix grep regex, содержащий 'x', но не содержащий 'y'

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

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

Ответ 1

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

Ответ 2

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

grep "alpha" | grep -v "beta"

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

Ответ 3

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

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

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

Ответ 4

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

EDIT:

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

Ответ 5

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