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.)