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

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

 findstr /s /c:some-symbol *

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

 grep -R some-symbol *

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

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


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

Некоторые из ваших файлов в UTF-16, а некоторые в ASCII, или как?

Artelius 03.01.2009 00:38

Да, немного ASCII, немного UTF-16.

David Martin 03.01.2009 00:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
2
15 311
7

Ответы 7

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

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

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

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

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

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

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

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

В их домашних средах unix UTF-16 встречается гораздо реже, а файлы обычно находятся в UTF-8, с которым они отлично справляются.

bdonlan 18.05.2009 01:13

Может быть, не так хорошо для извлечения всей строки, но идеально подходит для поиска всех файлов, содержащих строку (что я пытаюсь сделать). Спасибо.

Kevin Shea 27.10.2015 15:01

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

find /i /n "YourSearchString" *.*

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

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

К сожалению, команда find не поддерживает шаблоны сопоставления, такие как findstr (подстановочные знаки / регулярные выражения).

Mister_Tom 10.05.2016 20:55

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

TYPE UTF-16.txt > ASCII.txt

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

FINDSTR object ASCII.txt

... простите, что?

user541686 01.02.2018 04:13
findstr /s /c:some-symbol *

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

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

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

Eli 04.11.2013 19:36

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

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

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

Другие вопросы по теме