Почему появляется сообщение об ошибке
Если вы скопируете команду из вопроса и проанализируете ее с помощью UTF-8 в интерпретатор Unicode, то –
перед i
будет en da sh U + 2013, а не дефис-минус -
(U + 002D). Это означает, что grep
обрабатывает –i
как шаблон, который нужно искать, и where
как файл, который нужно искать, который не существует - как говорится в сообщении об ошибке.
$ echo "grep –i where | wc -l" | utf8-unicode -w 3
0x67 = U+0067
0x72 = U+0072
0x65 = U+0065
0x70 = U+0070
0x20 = U+0020
0xE2 0x80 0x93 = U+2013
0x69 = U+0069
0x20 = U+0020
0x77 = U+0077
0x68 = U+0068
0x65 = U+0065
0x72 = U+0072
0x65 = U+0065
0x20 = U+0020
0x7C = U+007C
0x20 = U+0020
0x77 = U+0077
0x63 = U+0063
0x20 = U+0020
0x2D = U+002D
0x6C = U+006C
$
код для utf8-unicode
теперь доступен в моем репозитории SOQ (вопросы о переполнении стека) на GitHub в виде файла utf8-unicode-1.11.tgz
в подкаталоге packages . Это текущая версия - utf8-unicode -V
сообщает utf8-unicode: UTF8-UNICODE Version 1.11 (2017-06-12 06:22:15)
и utf8-unicode -h
помогает. Использование -w 3
означает, что он оставляет достаточно места для каждой кодовой точки шириной 3 байта, что приводит к большему столбцовому выводу (по умолчанию -w 1
).
Другие улучшения
В Анализ выше, я не рассматривал, как улучшить сценарий в целом. Если у вас достаточно современный GNU grep
, вы можете использовать только две команды:
$ grep -iow where file2.txt | wc -l
Вы не можете уменьшить его до одной команды; использование grep -ciow where file2.txt
дает 1, а не 3 (поскольку совпадает только одна строка ввода).
С не-GNU grep
вам может понадобиться:
$ tr ' ' '\n' < file2.txt | grep -ic where
Остерегайтесь UUo C - Бесполезное использование cat
.