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

时间:2016-04-06 11:35:59

标签: windows batch-file for-loop cmd findstr

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

之类的内容
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上安装任何额外的东西?

1 个答案:

答案 0 :(得分:0)

试试这个。它将所有行回显到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
  氏试验
  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
    )
)

结果是相同的输出。