Findstr или grep, который автоматически определяет кодировку chararacter (UTF-16)

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

 findstr /s /c:some-symbol *

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

 grep -R some-symbol *

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

Любые предложения?


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

Ответ 1

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

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

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

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

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

Ответ 2

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

find /i /n "YourSearchString" *.*

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

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"

Ответ 3

findstr /s /c:some-symbol *

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

for /r %f in (*) do @find /i /n "some-symbol" "%f"

Ответ 4

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

TYPE UTF-16.txt > ASCII.txt

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

FINDSTR object ASCII.txt

Ответ 5

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

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

type *.* | findstr /s /c:some-symbol

Ответ 6

В соответствии с этой статьей статьи в блоге Damon Cortesi 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. Автор этой статьи также предоставляет оболочку script, чтобы сделать выше, что вы можете найти в github здесь.

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

Ответ 7

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

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