Мне нужно однопроходное регулярное выражение для unix grep, которое содержит, скажем, альфа, но не содержит бета.
grep 'alpha' <> | grep -v 'beta'
Мне нужно однопроходное регулярное выражение для unix grep, которое содержит, скажем, альфа, но не содержит бета.
grep 'alpha' <> | grep -v 'beta'
^((?!beta).)*alpha((?!beta).)*$
сделал бы трюк, я думаю.
Другие ответы здесь показывают некоторые способы, которыми вы можете сузить разные варианты регулярных выражений, хотя я думаю, что получается, что в общем случае ответ "не делайте этого". Такие регулярные выражения гораздо труднее читать и, вероятно, медленнее выполнять, чем просто комбинировать два регулярных выражения, используя логическую логику любого языка, который вы используете. Если вы используете команду grep
в командной строке unix, просто передайте результаты одного из них другому:
grep "alpha" | grep -v "beta"
Я использую такую конструкцию все время, чтобы вывести чрезмерные результаты из grep
. Если у вас есть представление о том, какой набор результатов будет меньше, поставьте его первым в конвейере, чтобы получить максимальную производительность, поскольку вторая команда должна обрабатывать вывод только из первого, а не всего ввода.
Ну, как мы все отправляем ответы, вот он в awk; -)
awk '/x/ && !/y/' infile
Надеюсь, это поможет.
Я уверен, что это невозможно с истинными регулярными выражениями. Пример [^y]*x[^y]*
соответствовал бы yxy, так как * допускает нулевые или более совпадения не-y.
EDIT:
Собственно, это работает: ^[^y]*x[^y]*$
. Это в основном означает "сопоставить любую строку, начинающуюся с нуля или более символов, отличных от y, а затем имеет x, а затем заканчивается нолью или более символами не-y".
Попробуйте использовать оператор исключений: [^y]*x[^y]*