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 /L
比 for /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(文件内容)的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 批处理脚本的 for 循环中未通过“查找”命令获得所需的输出
循环完成后 FOR 循环恢复执行 - DOS(Windows 命令行)