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

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

 findstr /s /c:some-symbol *

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

 grep -R some-symbol *

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

Какие-либо предложения?


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


person David Martin    schedule 02.01.2009    source источник
comment
Некоторые из ваших файлов в UTF-16, а некоторые в ASCII или как?   -  person Artelius    schedule 03.01.2009
comment
Да, немного ASCII, немного UTF-16.   -  person David Martin    schedule 03.01.2009


Ответы (7)


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

TYPE UTF-16.txt > ASCII.txt

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

FINDSTR object ASCII.txt
person PollusB    schedule 04.09.2012
comment
... простите, что? - person user541686; 01.02.2018
comment
или type UTF-16.txt | findstr, если вам не нужно имя файла (OP требует имени файла, потому что ищет несколько файлов, но некоторые могут найти это полезным) - person yoyo; 13.05.2021

Спасибо за предложения. Я имел в виду 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.

person David Martin    schedule 04.01.2009
comment
В их домашних средах Unix UTF-16 встречается гораздо реже, а файлы обычно имеют формат UTF-8, с которым они прекрасно справляются. - person bdonlan; 18.05.2009
comment
Может быть, не так хорошо для извлечения всей строки, но идеально подходит для поиска всех файлов, содержащих строку (что я и пытаюсь сделать). Спасибо. - person Kevin Shea; 27.10.2015

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

find /i /n "YourSearchString" *.*

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

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"
person vent    schedule 21.07.2011
comment
К сожалению, команда find не поддерживает шаблоны сопоставления, такие как findstr (подстановочные знаки/регулярные выражения). - person Mister_Tom; 10.05.2016

findstr /s /c:some-symbol *

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

for /r %f in (*) do @find /i /n "some-symbol" "%f"
person Shameer    schedule 09.01.2013
comment
Если добавить ответ Венкатешвара ниже, вы получите: for /r %f in (*) do @find /i /n some-symbol %f | findstr /i какой-то символ, который будет отфильтровывать имена файлов. Я нашел это полезным при поиске набора файлов в поисках Fail. Мне было все равно, в каком файле он появился, я просто хотел посмотреть, есть ли в нем файл Fail. - person Eli; 04.11.2013

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

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

person Mark A. Nicolosi    schedule 02.01.2009

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

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

type *.* | findstr /s /c:some-symbol
person kenorb    schedule 24.01.2017

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

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

person Jan Goyvaerts    schedule 03.01.2009