Как найти все строки, содержащие два указанных слова? [дубликат]

$ @ в двойных кавычках расширяется до списка элементов «$ 1» «$ 2» «$ 3» и т. Д.

#!/bin/bash
expand () {
    for string in "from $@" ; do
        echo "$string"
    done
}

expand sys import stdout

Python ожидает, что код будет в одном аргументе, а не в серии аргументов.

5
17.10.2018, 20:07
4 ответа

с помощью GNU sed:

sed -n '/cat/I {/elephant/I p}' file

или перл

perl -ne 'print if /cat/i and /elephant/i' file

или один grep

grep -i -e 'cat.*elephant' -e 'elephant.*cat' file
3
27.01.2020, 20:31

Вы можете сделать это в не -GNU awkиспользуя прием «бедняка», чтобы получить нечувствительность к регистру :

awk  '/[Cc][Aa][Tt]/ && /[Ee][Ll][Ee][Pp][Hh][Aa][Nn][Tt]/'  file
где так же, как [aeiou]соответствует любому из a, e, i, oили u, [Ee]соответствует либо E, либо e, то есть нечувствительному к регистру -совпадению для «e».

Обратите внимание, что этот подход (похож навседругие ответы, размещенные здесь до сих пор )будет соответствовать строке

There are many ways to catch an elephant.
потому что слово «cat ch» содержит строку «cat». Если вы хотите избежать этого, попробуйте
awk  '/(^|\W)[Cc][Aa]Tt/ && /(^|\W)[Ee][Ll][Ee][Pp][Hh][Aa][Nn]Tt/'  file
, где вы ограничиваете каждое слово которому должен предшествовать не -словесный символ (или начало строки )за которым следует не -символ слова (или конец строки )— \Wсоответствует не -словесному символу (, т. е. пробелу (или табуляции )или другой не -буквенно-цифровой *символ ).

(Я не уверен, соответствует ли это POSIX -.)

Обратите внимание, что теперьне будетсоответствовать

Cat and elephants live in different environments
, потому что слово «слоны» не совпадает со словом «слон».
__________________
* В этом контексте подчеркивание (символ «_» )считается буквой.
2
27.01.2020, 20:31
$ grep -Fiw cat <file | grep -Fiw elephant
Cat is smaller than elephant
Elephant is larger than cat

Сначала мы извлекаем из файла fileвсе строки, содержащие слово cat, а затем сужаем эти строки до строк, содержащих слово elephant.

Это делается с помощью grep -F -i -w, где

  • -Fзаставляет grepрассматривать шаблон как фиксированную строку, а не как регулярное выражение,
  • -iделает grepнечувствительным к регистру -сопоставление, а
  • -wзаставляет grepсоответствовать только полным словам.

Опция -wявляется расширением стандарта POSIX для grep, но реализуется наиболее распространенными реализациями grep. Это в основном запрещает совпадения данного шаблона, когда совпадающая строка является частью более длинного слова.

Обратите внимание, что я не сопоставляю строку

Cat and elephants live in different environment

Это связано с окончательным sв elephants. Я бы тоже не стал сопоставлять строчку

elephantiasis is catastrophic

по той же причине.

Если вы хотите разрешить множественное число sв конце слов, используйте

$ grep -Eiw 'cats?' <file | grep -Eiw 'elephants?'
Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment

Здесь мы используем (расширенное )регулярное выражение вместо фиксированной строки в обоих вызовах grep. Выражения будут соответствовать необязательному sв конце двух слов. Теперь мы сопоставляем catиcats(случай -без учета ), но не будем сопоставлять catnip, catsupили scat.

6
27.01.2020, 20:31

Сgrep

grep -i "cat" file | grep -i "elephant"

Cat is smaller than elephant
Elephant is larger than cat
Cat and elephants live in different environment

Флаг в grepдолжен игнорировать регистр (верхний/нижний)

 -i, --ignore-case         ignore case distinctions

илиawk

awk 'BEGIN{IGNORECASE=1} /cat/&&/elephant/{print $0}' file

@glenn jackman предположил, что оператор awkможно запустить следующим образом:

awk '/cat/&&/elephant/' IGNORECASE=1 file
8
27.01.2020, 20:31

Теги

Похожие вопросы