Многие программы принимают один дефис (-
) в качестве инструкции для использования стандартного ввода.Рассмотрим, учитывая, как вы вызываете вашу примерную команду, следующее:
cat file.txt | grep -Fow "$word" - | wc -l
Это количество экземпляров $word
в данном файле.Параметр -F
ускоряет поиск, отключая регулярные выражения (поэтому .
фактически означает .
), -o
устанавливает вывод для отображения только совпадений (по одному в строке), а параметр -w
требуетграница слова на обеих сторонах слова (поэтому foo
будет не совпадать food
; уберите этот флаг, чтобы изменить это).wc -l
даст вам количество строк, выведенных grep
, что является количеством экземпляров $word
.(Я не использовал grep -c
, потому что это подсчитывает строки со совпадениями, что означает, что foo bar foo baz
на строке будет считаться только один раз.)
Если count-words
- ваш сценарий, рассмотритеодин из следующих вариантов:
# imply standard input when given insufficient arguments
# or when the only argument is a hyphen
# (requires you to `shift` your options and the query term)
if [ "$#" = "0" ] || [ "$*" = "-" ]; then
set -- /dev/stdin
fi
# convert hyphen(s) to /dev/stdin within the argument list
FIRST=1
for OPT in "$@"; do
if [ "$FIRST" = 1 ]; then
unset FIRST
set --
fi
if [ "$OPT" = "-" ]; then
OPT="/dev/stdin"
fi
set -- "$@" "$OPT"
done
Это позволит вам использовать любой из
count-words "$word" < file.txt
get-input | count-words "$word"
get-input | count-words "$word" -
get-input | count-words "$word" /dev/stdin
echo "$(get-input)" | count-words "$word"
count-words "$word" <<<"list of words as if echoed"
count-words "$word" <(get-input)
Последние триявляются ошибками и не будут работать в dash
или других более простых /bin/sh
программах.Самая последняя команда указывает count-words
использовать подстановка процесса для предоставления именованного канала в качестве временного дескриптора файла, в котором хранится вывод get-input
.