Я пытался найти способ отфильтровать строку, в которой есть слова «лимон» и «рис». Я знаю, как найти «лимон» или «рис», но не их обоих. Они не должны быть рядом друг с другом, просто одна и та же строка текста.
text-processing
grep
Себастьян
источник
источник
Ответы:
«Оба на одной строке» означает «рис», за которым следуют случайные символы, за которыми следует «лимон» или наоборот ».
В регулярном выражении это
rice.*lemon
илиlemon.*rice
. Вы можете объединить это, используя|
:Если вы хотите использовать обычные регулярные выражения вместо расширенных (
-E
), вам необходимо использовать обратную косую черту перед|
:Для большего количества слов это быстро становится немного длиннее, и обычно проще использовать несколько вызовов
grep
, например:источник
grep rice
находит строки, содержащиеrice
. Он подается вgrep lemon
который будут только строки, содержащие лимон .. и так далее. Принимая во внимание, что ФП - а также ваши предыдущие ответы - разрешают любой из [рис | лимон | курица]|
нужно сбежатьgrep
? Спасибо!egrep
использует расширенное регулярное выражение, где|
понимается как логика ИЛИ.grep
по умолчанию используется базовое регулярное выражение, где\|
ORgrep
man-странице,egrep
устарела и должна быть заменена наgrep -E
. Я взял на себя свободу редактировать ответ соответственно.Вы можете направить вывод первой команды grep в другую команду grep, которая будет соответствовать обоим шаблонам. Итак, вы можете сделать что-то вроде:
или же,
Пример:
Давайте добавим немного содержимого в наш файл:
Что содержит файл:
Теперь давайте попробуем, что мы хотим:
Мы получаем только те строки, где оба шаблона совпадают. Вы можете расширить это и передать вывод в другую команду grep для дальнейших совпадений «И».
источник
Хотя вопрос требует «grep», я подумал, что было бы полезно опубликовать простое «awk» решение:
Это может быть легко расширено с помощью большего количества слов или других логических выражений, кроме 'и'.
источник
Другая идея для нахождения совпадений в любом порядке:
grep с
-P
(Perl-Compatibility) опцией и регулярным регулярным выражением(?=(regex))
:или вы можете использовать ниже, вместо этого:
.*?
средства , соответствующие любые символы ,.
которые вхождения ноль или более раз ,*
пока они не являются обязательными с последующим рисунком (rice
илиlemon
). Он?
делает все необязательным перед ним (означает ноль или один раз из всего совпадения.*
)(?=pattern)
: Positive Lookahead: положительная конструкция lookahead представляет собой пару круглых скобок, за открывающей скобкой следует знак вопроса и знак равенства.Таким образом, это вернет все строки с содержит как
lemon
иrice
в случайном порядке. Также это позволит избежать использования|
s и удвоенныхgrep
s.Внешние ссылки: Advanced Grep Темы Positive Lookahead - GREP для дизайнеров
источник
Вернет совпадения для foo или goo
источник
Если мы признаем, что предоставление ответа, который не
grep
основан, является приемлемым, как и вышеупомянутый ответ, основанный наawk
, я бы предложил простуюperl
строку вроде:Поиск может игнорировать регистр с некоторыми / всеми словами, как
/lemon/i and /rice/i
. На большинстве машин Unix / Linux в любом случае устанавливается perl и awk.источник
Вот скрипт для автоматизации решения grep piping:
источник
eval
разбирать ее, что легко ломается