1 (изменено: yuriy2000, 2012-09-16 12:42:02)

Тема: CMD/BAT: findstr и кодировка 1251

Коллеги, не подскажите как заставить findstr искать кириллицу в файлах с кодировкой 1251?
Кроме перекодировки входных файлов.

конструкция  не работает


@chcp 1251 >nul
findstr "супер-пупер-строка"

аналогичная конструкция для GNU grep работает нормально.


@chcp 1251 >nul
grep "супер-пупер-строка"

2

Re: CMD/BAT: findstr и кодировка 1251

Кроме перекодировки входных файлов ещё возможна перекодировка "супер-пупер-строки"…

3 (изменено: yuriy2000, 2012-09-17 07:46:48)

Re: CMD/BAT: findstr и кодировка 1251

wisgest пишет:

Кроме перекодировки входных файлов ещё возможна перекодировка "супер-пупер-строки"…

да, согласен, но этот чертов findstr не все перекодированные таким образом кириллические буквы понимает.
Например [ю] [П]

я же предполагал использовать вызов через передачу параметра


@chcp 1251 >nul
findstr "%1" *.html 
@chcp 866 >nul

4

Re: CMD/BAT: findstr и кодировка 1251

yuriy2000 пишет:

я же предполагал использовать вызов через передачу параметра

Можно попробовать перекодировать и переменный параметр.
Я, правда, не уверен, что нельзя придумать что-либо получше и не проверял, как это работает со всеми буквами, но мне на ум приходят лишь два решения:
воспользоваться для перекодировки строки временным файлом:

chcp 1251>nul
echo %1>tmp.tmp
chcp 866>nul
set /p str=<tmp.tmp
findstr "%str%" *.html

или зафиксировать в самом командном файле две строки с символами в разных кодировках и потом во внешнем цикле посимвольно просматривать преобразуемую строку, во внутреннем цикле — строку с символами в одной кодировке и при нахождении совпадения заменять символом второй кодировки с тем же номером…

Может, чем-то полезна будет тема «CMD/BAT: обработка (фильтрация) текста» (я в неё не вникал)?

5

Re: CMD/BAT: findstr и кодировка 1251

cmd /c "chcp 1251 >nul && echo Вася | (chcp 866 > nul && find /v "") | findstr /g:/ file.txt | (chcp 1251 >nul && find /v "")"
Я конечно далек от мысли... (с)

6

Re: CMD/BAT: findstr и кодировка 1251

wisgest пишет:

воспользоваться для перекодировки строки временным файлом:

chcp 1251>nul
echo %1>tmp.tmp
chcp 866>nul
set /p str=<tmp.tmp
findstr "%str%" *.html

Такая перекодировка тоже не помогает.  Попробовал с разными входными строками  так и не понял почему в каких-то случаях работает, в каких то нет. Видимо некоторые символы кириллицы при перекодировке у findstr вызывают помешательство. Он даже не пытается искать....

Вывод: Сам буду использовать grep , а остальным предложу конвертировать входные файлы.

7

Re: CMD/BAT: findstr и кодировка 1251

smaharbA пишет:
cmd /c "chcp 1251 >nul && echo Вася | (chcp 866 > nul && find /v "") | findstr /g:/ file.txt | (chcp 1251 >nul && find /v "")"

smaharbA   можете описать  что делает этот код, а то тут куча конвейеров - не совсем понятно...

8 (изменено: Blaze812, 2012-12-01 03:02:33)

Re: CMD/BAT: findstr и кодировка 1251

Всё просто

@Echo off

chcp 1251 >nul 2>&1
set str1=Основной шлюз
for /f "tokens=*" %%i in ('ipconfig /all') do call :to866 "%%i"

Pause >nul 2>&1
EXIT

:to866
chcp 866 >nul 2>&1
echo.%~1 | findstr /I /C:"%str1%"
GoTo :EOF

9

Re: CMD/BAT: findstr и кодировка 1251

@Echo off

chcp 1251 >nul 2>&1
set str1=Основной шлюз
for /f "tokens=*" %%i in ('ipconfig /all') do call :to866 "%%i"

Pause >nul 2>&1
EXIT

:to866
chcp 866 >nul 2>&1
echo.%~1 | findstr /I /C:"%str1%"
GoTo :EOF

10

Re: CMD/BAT: findstr и кодировка 1251

Blaze812 я что-то не понял при чем тут этот пример?
Речь шла о том, что нужно искать текстовые строки в файлах с кодировкой 1251.
Дополнительное условие:  Размер входных файлов достаточно велик, чтобы их перекодировать.

Самый простой способ использовать grep, но к сожалению grep есть не на каждой машине...

11

Re: CMD/BAT: findstr и кодировка 1251

А если так:

@Echo off

chcp 1251 >nul 2>&1
set str1=Строка или часть строки, которую ищем. 
for /f "tokens=*" %%i in (Имя файла с путем, на английском или в DOS кодировке.) do call :to866 "%%i"
del /f /q "%temp%\000.txt"
for /f "tokens=*" %%i in (%temp%\001.txt) do echo.%%~i
del /f /q "%temp%\001.txt"

Pause >nul 2>&1
EXIT

:to866
chcp 866 >nul 2>&1
>"%temp%\000.txt" echo.%1%
>>"%temp%\001.txt" findstr /I /C:"%str1%" "%temp%\000.txt"
GoTo :EOF

Медленно конечно... на файл 21847 строк ушло 4 минуты...

12

Re: CMD/BAT: findstr и кодировка 1251

Blaze812 пишет:

Медленно конечно... на файл 21847 строк ушло 4 минуты...

1. искомая строка должна быть входным параметром для .bat-файла
2. 4 минуты для 20 тысяч строк... такая "скорость" никуда не годится. ;(

13

Re: CMD/BAT: findstr и кодировка 1251

@Echo off

:: Поиск кириллической строки с помощью findstr.
:: Параметры запуска: строка поиска/имя файла с путем
:: Пример: "C:\Findtxt.bat" что я ищу/C:\Мой текст.txt

chcp 1251 >nul 2>&1
set str=%*%
for /f "tokens=1,2* delims=/" %%a in ('echo.%str%') do (
set str=%%a
set file="%%~b"
)

for /f "tokens=*" %%i in ('cmd /c "chcp 1251 >nul && echo.%str% | (chcp 866 > nul && find /v "") | findstr /g:/ %file% | (chcp 1251 >nul && find /v "")"') do  (
chcp 866 >nul 2>&1
echo.%%i
)
Pause >nul 2>&1
EXIT

14

Re: CMD/BAT: findstr и кодировка 1251

echo off
chcp 1251 > nul
chcp 866 > nul&echo строка в сп1251|findstr "строка"

Я конечно далек от мысли... (с)

15 (изменено: yuriy2000, 2012-12-11 21:48:54)

Re: CMD/BAT: findstr и кодировка 1251

Нужен универсальный способ вызова findstr для обработки текстовых файлов в кодировке 1251.
Без предварительной перекодировки входных файлов.

Я уточняю условия  (это только один из случаев, просто для примера):
Допустим есть пара тысяч html-файлов - нужно среди них найти все файлы в которых содержится определенная строка (состоящая из кириллицы), чтобы скопировать эти файлы в другой каталог

Если строка не содержит кириллицу, то делаем так

for /F %A in ('findstr /M "строка" *.html') do @xcopy %A  C:\backup 

Задача заменить findstr на любой bat/cmd-file или даже VBS, но только бы заставить этот findstr искать строки в файлах с кодировкой 1251. Способ простой перекодировки вводимой строки из 1251 в 866 не срабатывает, поскольку этот чертов findstr некоторые перекодированные символы не понимает.  Например ю и П.
Единственный, на мой взгляд способ, (хотя и не очень корректный) это сделать собственную таблицу перекодировки, win2dos, и те символы, которые findstr не понимает, заменять на точку.

16

Re: CMD/BAT: findstr и кодировка 1251

echo off
chcp 1251 > nul
chcp 866 > nul&echo строка в сп1251|findstr /c:"строка в сп"

Я конечно далек от мысли... (с)

17 (изменено: yuriy2000, 2012-12-12 21:19:35)

Re: CMD/BAT: findstr и кодировка 1251

smaharbA пишет:

echo off
chcp 1251 > nul
chcp 866 > nul&echo строка в сп1251|findstr /c:"строка в сп"

И где здесь поиск по входным файлам?