$ @
в двойных кавычках расширяется до списка элементов «$ 1» «$ 2» «$ 3»
и т. Д.
#!/bin/bash
expand () {
for string in "from $@" ; do
echo "$string"
done
}
expand sys import stdout
Python ожидает, что код будет в одном аргументе, а не в серии аргументов.
с помощью 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
Вы можете сделать это в не -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, потому что слово «слоны» не совпадает со словом «слон».
$ 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
.
С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