Search code examples
windowsbatch-filefor-loopcmdfindstr

Windows - findstr in for loop (file content)


I have a text file which containts stuff like

M       test123
S       test
M       abc

and so on...

I'm trying to write a batch script that will do the following:

Read this text file, search every line for "M       " (with spaces!) and then save the found line in a variable, delete the "M       " and store the output in a seperate output.txt

So the output.txt should containt then following:

test123
S       test
abc

Here's what I have so far:

SETLOCAL ENABLEDELAYEDEXPANSION 
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (output_whole_check.txt) DO (
SET var!count!=%%F
findstr /lic:"M       " > nul && (set var!count!=var!count!:~8%) || (echo not found)
SET /a count=!count!+1
)
ENDLOCAL

Or is there some easier way to solve that without any additional stuff installed on windows?


Solution

  • Try this one. It echoes all lines to output.txt with "M       " replaced with nothing.

    @echo off & setlocal
    
    >output.txt (
        FOR /F "usebackq delims=" %%I IN ("output_whole_check.txt") DO (
            set "line=%%I"
            setlocal enabledelayedexpansion
            echo(!line:M       =!
            endlocal
        )
    )
    

    Result:

    test123
    S       test
    abc


    Or if your output_whole_check.txt is very large, it might be faster to loop over the lines using a for /L loop. for /L is more efficient than for /F. You just have to get a count of the lines to determine how many iterations to loop.

    @echo off & setlocal
    
    rem // get number of lines in the text file
    for /f "tokens=2 delims=:" %%I in ('find /v /c "" "output_whole_check.txt"') do set /a "count=%%I"
    
    <"output_whole_check.txt" >"output.txt" (
        for /L %%I in (1,1,%count%) do (
            set /P "line="
            setlocal enabledelayedexpansion
            echo(!line:M       =!
            endlocal
        )
    )
    

    The result is the same output.