【问题标题】:Windows - findstr in for loop (file content)Windows - for 循环中的 findstr(文件内容)
【发布时间】:2016-07-26 18:53:49
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    结果是一样的输出。

    【讨论】:

    • 这对我来说很好 :-),如果我想添加第二个像“S......”,我有“m.... " 和 "s....." ?
    • 最简单的事情是,在setlocal enabledelayedexpansion 行的正下方,执行set "line=!line:S =!"(其中的空白有七个空格,StackOverflow 对显示的帮助不大)。或者,如果您想删除 all 字符串,其中有一个字母后跟七个空格,请将echo 行更改为echo(!line:* =!(同样,其中* 是一个星号后跟七个空格) .
    • 好的,谢谢 :-) 现在剩下最后一个问题...如果其中一行包含 /test/ 的任何位置,那么我不想在 output.txt 中包含它。这将如何工作?
    • 这是为了防止插入包含任何位置 /test/ 的整行吗?
    • 啊,我搞砸了。取出not。做if /i "!line!"=="!line:/test/=!" echo(... etc. 对不起。这意味着如果 !line! 在删除和不删除 /test/ 的情况下相同,则 echo
    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2022-01-13
    • 2020-02-03
    相关资源
    最近更新 更多