findstr или grep, который автоматически определяет кодировку символов (UTF-16) - PullRequest
11 голосов
/ 03 января 2009

Я хочу сделать это:

 findstr /s /c:some-symbol *

или эквивалент grep

 grep -R some-symbol *

но мне нужна утилита для автоматического определения файлов, закодированных в UTF-16 (и друзей), и поиска их соответствующим образом. В моих файлах даже есть метка порядка байтов FFEE, поэтому я даже не ищу героического автоопределения.

Есть предложения?


Я имею в виду Windows Vista и XP.

Ответы [ 7 ]

4 голосов
/ 04 января 2009

Спасибо за предложения. Я имел в виду Windows Vista и XP.

Я также обнаружил этот обходной путь, используя бесплатные Sysinternals strings.exe:

C:\> strings -s -b dir_tree_to_search | grep regexp 

Strings.exe извлекает все найденные строки (из двоичных файлов, но отлично работает и с текстовыми файлами) и добавляет каждый результат к имени файла и двоеточию, поэтому примите это во внимание в регулярном выражении (или используйте команду cut или другой шаг) в трубопроводе). -s делает рекурсивное извлечение, а -b просто подавляет баннерное сообщение.

В конечном счете, я все еще немного удивлен, что ведущие утилиты поиска Gnu grep и findstr не обрабатывают кодировки Unicode изначально.

3 голосов
/ 22 июля 2011

В Windows вы также можете использовать find.exe.

find /i /n "YourSearchString" *.*

Единственная проблема - это печать имен файлов, за которыми следуют совпадения. Вы можете отфильтровать их, отправив команду findstr

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
2 голосов
/ 09 января 2013
findstr /s /c:some-symbol *

можно заменить следующей командой, поддерживающей кодировку символов:

for /r %f in (*) do @find /i /n "some-symbol" "%f"
2 голосов
/ 04 сентября 2012

Обходной путь - конвертировать UTF-16 в ASCII или ANSI

TYPE UTF-16.txt > ASCII.txt

Тогда вы можете использовать FINDSTR.

FINDSTR object ASCII.txt
1 голос
/ 25 января 2017

В более поздних версиях Windows UTF-16 поддерживается прямо из коробки. Если нет, попробуйте изменить активную кодовую страницу с помощью команды chcp.

В моем случае при использовании только findstr для файлов UTF-16 произошел сбой, однако он работал с type:

type *.* | findstr /s /c:some-symbol
0 голосов
/ 03 января 2009

Вы не сказали, на какой платформе вы хотите это сделать.

В Windows вы можете использовать PowerGREP , который автоматически обнаруживает файлы Unicode, начинающиеся с метки порядка байтов. (Существует также опция автоматического определения файлов без спецификации. Автоопределение очень надежно для UTF-8, но ограничено для UTF-16.)

0 голосов
/ 03 января 2009

Согласно этой статье в блоге Деймона Кортези, grep не работает с файлами UTF-16, как вы выяснили. Тем не менее, он представляет этот обходной путь:

for f in `find . -type f | xargs -I {} file {} | grep UTF-16 | cut -f1 -d\:`
        do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f ${GREP_FOR}
done

Это очевидно для Unix, не уверен, какой будет эквивалент в Windows. Автор этой статьи также предоставляет shell-скрипт для выполнения вышеупомянутого, который вы можете найти на github здесь .

Это только файлы greps, которые имеют формат UTF-16. Вы также можете записывать файлы ASCII обычным способом.

...