Самый простой способ - просто преобразовать текстовый файл в utf-8 и передать его в grep:
iconv -f utf-16 -t utf-8 file.txt | grep query
Я пытался сделать обратное (преобразовать мой запрос в utf-16), но похоже, что grep это не нравится. Я думаю, что это может быть связано с порядком байтов, но я не уверен.
Кажется, что grep преобразует запрос utf-16 в utf-8 / ascii. Вот что я попробовал:
grep `echo -n query | iconv -f utf-8 -t utf-16 | sed 's/..//'` test.txt
Если test.txt является файлом utf-16, это не сработает, но сработает, если test.txt имеет формат ascii. Я могу только заключить, что grep преобразует мой запрос в ascii.
РЕДАКТИРОВАТЬ: Вот действительно очень сумасшедший, который работает, но не дает вам много полезной информации:
hexdump -e '/1 "%02x"' test.txt | grep -P `echo -n Test | iconv -f utf-8 -t utf-16 | sed 's/..//' | hexdump -e '/1 "%02x"'`
Как это работает? Ну, он конвертирует ваш файл в шестнадцатеричный формат (без какого-либо дополнительного форматирования, который обычно применяется hexdump). Это передает это в grep. Grep использует запрос, который создается путем вывода вашего запроса (без новой строки) в iconv, который преобразует его в utf-16. Затем он передается в sed для удаления спецификации (первые два байта файла utf-16, используемые для определения порядка байтов). Затем он передается в hexdump, чтобы запрос и ввод совпадали.
К сожалению, я думаю, что это приведет к распечатке ВСЕГО файла, если будет одно совпадение. Также это не сработает, если utf-16 в вашем двоичном файле хранится в другом порядке, чем ваша машина.
РЕДАКТИРОВАТЬ 2: Понял !!!!
grep -P `echo -n "Test" | iconv -f utf-8 -t utf-16 | sed 's/..//' | hexdump -e '/1 "x%02x"' | sed 's/x/\\\\x/g'` test.txt
Поиск шестнадцатеричной версии строки Test
(в utf-16) в файле test.txt