Самый простой алгоритм, и тем не менее тот, который является очень эффективным, должны были бы обнулить R триплета RGB для видимой области.
красный исчезает, но другие цвета сохраняются.
дальнейшее расширение А этого алгоритма могло бы включить обнуление, значение R только для утраивания, где красный является доминирующим цветом (R> G и R> B).
grep "hehe" < test.sh
Перенаправление ввода - работает, конечно, только для одного файла, тогда как cat
работает для любого количества входных файлов.
Обратите внимание на обозначения:
grep "hehe" $(cat test.sh)
grep "hehe" `cat test.sh`
Они эквивалентны в данном контексте; гораздо проще использовать нотацию ' $ (cmd)
»во вложенных применениях, например:
x=$(dirname $(dirname $(which gcc)))
x=`dirname \`dirname \\\`which gcc\\\`\``
(Это дает вам базовый каталог, в котором установлен GCC, на случай, если вам интересно.)
В примере grep
происходит то, что содержимое test.sh
читается и разбивается на слова, разделенные пробелами, и каждое такое слово предоставляется в качестве аргумента на grep
. Поскольку grep
обрабатывает слова после «хе-хе»
(где grep
, конечно, не видит двойные кавычки - и они в этом случае не нужен; как правило, используйте одинарные кавычки, а не двойные, особенно вокруг сложных строк, таких как регулярные выражения, которые часто используют метасимволы оболочки) ... Как я уже говорил, grep
обрабатывает слова после "хе-хе" "
как имена файлов, и пытается открыть каждый файл, обычно неудачно, потому что файлы не существуют. Вот почему такая нотация неуместна в данном контексте.
После повторного рассмотрения вопроса можно сказать еще кое-что, чего еще не было.
Во-первых, многие команды Unix предназначены для работы как 'фильтры'; они считывают ввод из некоторых файлов, каким-то образом преобразуют его и записывают результат в стандартный вывод. Такие команды предназначены для использования в командных конвейерах. Примеры включают:
Все эти фильтры имеют одинаковое общее поведение: они используют параметры командной строки для управления своими поведение, а затем они либо читают файлы, указанные в качестве аргументов командной строки, либо, если таких аргументов нет, они читают свой стандартный ввод. Некоторые (например, sort
) могут иметь параметры для управления тем, куда направляется их вывод вместо стандартного вывода, но это относительно редко.
Есть несколько чистых фильтров - tr
один такие - которые строго читают стандартный ввод и записывают в стандартный вывод.
Другие команды имеют другое поведение. Эрик Рэймонд представляет таксономию типов команд в книге « Искусство программирования UNIX ».
Некоторые команды генерируют списки имен файлов на стандартном выводе - два классических примера - ls
и find
.
Иногда требуется применить вывод генератора имен файлов как аргументы командной строки для фильтра. Есть программа, которая делает это автоматически - это xargs
.
Обычно вы должны использовать:
find . -name '*.[chyl]' | xargs grep -n magic_name /dev/null
Это создаст полный список файлов с расширениями ' .c
',' .h
',' .y
'и' .l
'(исходный код C, заголовки, файлы Yacc и Lex). Поскольку список читается xargs
, он создает командные строки с grep -n magic_name / dev / null
в начале и каждым словом (разделенным пробелом) в качестве аргумента.
В старые времена имена файлов Unix не t включать пробелы. Под влиянием Mac и Windows такие пространства стали обычным явлением. Версии GNU find
и xargs
имеют дополнительные параметры для решения этой проблемы:
find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null
Параметр ' -print0
' означает, что имена файлов печати заканчиваются a NUL '\ 0' "(потому что единственные символы, которые не могут появиться в (простом) имени файла, это '/' и NUL, и, очевидно, '/' может появляться в именах путей). Соответствующее ' -0
' указывает xargs
искать имена, заканчивающиеся NUL, а не имена, разделенные пробелом.
find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null
Параметр ' -print0
' означает «печатать имена файлов, заканчивающиеся NUL '\ 0'» (потому что единственные символы, которые не могут появиться в (простом) имени файла, это '/' и NUL , и, очевидно, в именах путей может присутствовать '/'). Соответствующий ' -0
' указывает xargs
искать имена, заканчивающиеся NUL, а не имена, разделенные пробелом.
find . -name '*.[chyl]' -print0 | xargs -0 grep -n magic_name /dev/null
Параметр ' -print0
' означает «печатать имена файлов, заканчивающиеся NUL '\ 0'» (потому что единственные символы, которые не могут появиться в (простом) имени файла, это '/' и NUL , и, очевидно, в именах путей может присутствовать '/'). Соответствующее ' -0
' указывает xargs
искать имена, заканчивающиеся NUL, а не имена, разделенные пробелом.
Другой формой перенаправления является подстановка процесса.
grep "hehe" <(cat test.sh)
эквивалентно:
grep "hehe" test.sh
, которые оба смотрят на содержимое самого test.sh
.
Хотя , как было отмечено, эта команда:
grep "hehe" $(cat test.sh)
ищет имена файлов в test.sh
и использует их в качестве аргументов для grep
. Итак, если test.sh
состоит из:
scriptone
scripttwo
, то grep
будет искать «хе-хе» в содержимом каждого из этих файлов.
Используется как стандартный ввод.
Попробуйте:
grep "hehe" - $(cat test.sh)
Возможно, это неверно; Я не могу проверить это на этом компьютере. Если вы сделаете это без канала, как вы пытались, grep обработает последний аргумент как имя файла, т. Е. Ищет файл с именем [содержимое test.sh]. Если вы передадите ему - (или не укажете последний аргумент), вы укажете ему использовать stdin в качестве файла.
Вы также можете просто передать grep файл для сканирования:
grep "hehe" test.sh
... но вы похоже, задают более общий вопрос bash, а не вопрос использования grep, так что это, вероятно, не слишком полезно.