Пакет - найдите строку в первых 10 символах в строке и распечатайте всю строку

I am having trouble with findstr command. I am using batch file to execute a proccess that will search all .txt in folder and print out lines that have a string in first 10 characters that is previously defined. So far I have been using this batch:

for /f "delims=" %%I in ('dir/B *.txt') do (
    for /f "delims=" %%J in (%%I) do (
        set "=%%J"
        call echo %%:~0,10%%|findstr "R0621 32411"&&call echo %%_%% >> search.txt
    ) 
)
endlocal    
Somehow this batch however does not print out lines that consists strings like R0621 or 32411. Is this a bug? When I try the typical findstr batch it works and prints out lines just fine. For example this:
findstr "R0621 32411" *.txt >> search.txt
    
.txt files that this batch searches through looks like this:
AA32411   AAA RANDOMTEXTANDNUMBERS 13121313212153
BBR0621   BBB RANDOMTEXTANDNUMBERS 78975487798797
CCY4488   CCC RANDOMTEXTANDNUMBERS 44455577799998
    
I cant use the findstr because it finds string after 10 characters and those lines i dont need (i need only those that have strings i define in first 10 chars per line).

Есть ли альтернатива? Я пытался искать в Интернете, но нигде не мог найти никакой помощи. Также для лучшего понимания вы можете проверить мой предыдущий поток Пакетный поиск строки комбинации цифр и букв только в первых 10 символах (в текстовом файле) в строке и печать всей строки


person Angie    schedule 22.05.2014    source источник


Ответы (2)


@echo off
setlocal EnableDelayedExpansion

rem Seek the target strings in all .txt files
(for /F "tokens=1* delims=:" %%a in ('findstr "R0621 32411" *.txt') do (
   rem Check that the target string(s) exists in first 10 characters of found lines
   set "line=%%b"
   rem Get just the first 10 characters
   set "tenChars=!line:~0,10!"
   rem If R0621 was in first 10 characters
   if "!tenChars:R0621=!" neq "!tenChars!" (
      echo !line!
   rem If 32411 was in first 10 characters
   ) else if "!tenChars:32411=!" neq "!tenChars!" (
      echo !line!
   )
)) > search.out

Обратите внимание, что если выходной файл имеет также расширение .txt, он будет включен в исходный файл findstr! Вы можете использовать команду ren search.out search.txt в конце, чтобы переименовать выходной файл с правильным расширением, или создать выходной файл с расширением .txt в другом каталоге.

person Aacini    schedule 23.05.2014

@echo off
    setlocal enableextensions

    set "tempFile=%temp%\%~nx0.tmp"
    set "outputFile=search.out"

    (for %%a in ( 
        R0621 .R0621 ..R0621 ...R0621 ....R0621 .....R0621
        32411 .32411 ..32411 ...32411 ....32411 .....32411
    ) do @echo %%a) > "%tempFile%"

    type nul > "%outputFile%"
    for %%a in (*.txt) do findstr /r /b /g:"%tempFile%" "%%~a" >> "%outputFile%"

    del /q "%tempFile%" >nul 2>nul

    endlocal

Он просто создает временный файл с уточненными регулярными выражениями для поиска. Так как строки должны располагаться в первых 10 символах, а их длина составляет пять символов (все это жестко запрограммировано, но может быть адаптировано), строка поиска может начинаться с первой, второй, ... до шестой позиции от строки start (точка в регулярных выражениях означает, что в этой позиции может стоять любой символ)

После создания файла поиска цикл for будет перебирать .txt файлов, и для каждого из них мы ищем с помощью findstr, ища в начале строки (/b) регулярное выражение (/r), которое считывается из сгенерированного файла. (/g:)

person MC ND    schedule 23.05.2014
comment
Привет, попробовал и тоже работает, но не могу пометить 2 ответа как ответ, поэтому я отметил Аачини, так как он написал первым. В любом случае, это тоже отлично работает! Спасибо! :) - person Angie; 23.05.2014