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

Posted

技术标签:

【中文标题】Windows - for 循环中的 findstr(文件内容)【英文标题】:Windows - findstr in for loop (file content) 【发布时间】: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 上安装任何额外的东西?

【问题讨论】:

【参考方案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 =!"(其中的空白有七个空格,*** 对显示的帮助不大)。或者,如果您想删除 all 字符串,其中有一个字母后跟七个空格,请将echo 行更改为echo(!line:* =!(同样,其中* 是一个星号后跟七个空格) . 好的,谢谢 :-) 现在剩下最后一个问题...如果其中一行包含 /test/ 的任何位置,那么我不想在 output.txt 中包含它。这将如何工作? 这是为了防止插入包含任何位置 /test/ 的整行吗? 啊,我搞砸了。取出not。做if /i "!line!"=="!line:/test/=!" echo(... etc. 对不起。这意味着如果 !line! 在删除和不删除 /test/ 的情况下相同,则 echo

以上是关于Windows - for 循环中的 findstr(文件内容)的主要内容,如果未能解决你的问题,请参考以下文章

使用“for”循环迭代目录中的所有文件

for的一些bug

在 Windows 批处理脚本的 for 循环中未通过“查找”命令获得所需的输出

循环完成后 FOR 循环恢复执行 - DOS(Windows 命令行)

三. var let const的理解 以及 立即执行函数中的使用 以及 for循环中的例子

Windows Bat 之For 循环