Windows - for循环中的findstr(文件内容)

Windows - findstr in for loop (file content)

我有一个文本文件,其中包含

M       test123
S       test
M       abc

等等...

我正在尝试编写将执行以下操作的批处理脚本:

读取此文本文件,在每一行中搜索 "M       "(带空格!),然后将找到的行保存在变量中,删除 "M       " 并将输出存储在单独的 output.txt

所以 output.txt 应该包含以下内容:

test123
S       test
abc

这是我目前的情况:

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

或者有没有更简单的方法来解决这个问题而不需要在 windows 上安装任何额外的东西?

试试这个。它将所有行回显到 output.txt,"M       " 没有替换。

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

结果:

test123
S       test
abc


或者如果您的 output_whole_check.txt 非常大,使用 for /L 循环遍历这些行可能会更快。 for /Lfor /F 更有效率。您只需计算行数即可确定要循环的迭代次数。

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

结果是一样的输出。