Batch file 使用批处理删除文件中的部分字符串
我在一个文本文件(test.txt)中有一些数据,如下所示:Batch file 使用批处理删除文件中的部分字符串,batch-file,findstr,Batch File,Findstr,我在一个文本文件(test.txt)中有一些数据,如下所示: wantedunwanteddata 我想删除该字符串中的“不需要的”部分,并在另一个文件(test2.txt)中输出其余部分(即“wanteddata”) findstr /v "unwanted" test.txt>test2.txt 但是,这返回了一个空文件。为什么findstr/v“不需要”test.txt>test2.txt将不起作用,因为搜索与给定条件匹配的行。findstr将不返回与条件匹配的子字符串,而是返回
wantedunwanteddata
我想删除该字符串中的“不需要的”部分,并在另一个文件(test2.txt)中输出其余部分(即“wanteddata”)
findstr /v "unwanted" test.txt>test2.txt
但是,这返回了一个空文件。为什么
findstr/v“不需要”test.txt>test2.txt
将不起作用,因为搜索与给定条件匹配的行。findstr
将不返回与条件匹配的子字符串,而是返回满足条件的整行。findstr/v中的“不需要”test.txt>test2.txt
您要求test.txt
中的所有行都没有“不需要的”。这就是为什么test2.txt
是空的:没有这样的行
在批处理中,您可以使用以下语法替换变量值中出现的所有子字符串:%var:substr=repl%
。这将用%var%
包含的字符串中出现的所有substr
替换为repl
。因为删除子字符串类似于用空字符串替换(至少在此上下文中),您可以使用%var:substr=%
删除所有出现的substr
如果要删除文件中出现的所有子字符串,可以使用读取变量中该文件的每一行,并在删除子字符串后打印该变量。请注意,由于我们必须在/f的块内创建变量,并在同一块内使用它,因此需要(解释原因)
我已经在变量(分别是input
和output
)中设置了输入文件text1.txt
和输出文件input
的路径,而没有周围的引号(使用变量时会添加引号)。这将使得在需要时更容易更改它们。
围绕/f
的的额外(..)
仅用于处理指向outputfile的输出重定向。
如果您不想使用延迟扩展,您可以省略SetLocal EnableDelayedExpansion
和EndLocal
并将echo!行:%substr%=!
替换为call echo%%行:%substr%=%
中的for/f
的
编辑:如果输入文件包含特殊字符,如()|和%
,则必须使用延迟扩展。使用调用echo%%行中使用的正常变量扩展:%substr%=%%
这些特殊字符将由cmd解释器以其特殊含义进行处理(例如,
)并生成意外结果。
此外,我还介绍了substr
变量的赋值,但是如果您试图替换的子字符串包含特殊字符,如()|&%
为了使%substr%
按预期工作,还必须对每个字符进行转义。您可以转义带有插入符号的特殊字符^
,但必须加倍的%
除外(%
而不是%
)
EDIT2:for/f
跳过空行,因此,如果要在输出文件中保留这些空行,需要一些解决方法。纯批处理中的一个常见方法是使用findstr/n
或find/n
预结束每一行(包括空行)在将输入文件馈送到for/f
时使用它们的行号。这当然需要一些额外的处理来处理for/f
块中的行号,并将它们从for/f
的输出中删除,但这是可能的。类似的问题为这些工作提供了极好的解释ounds及其缺点。谢谢,@J.Baoby!这很好用。还有一个问题-如果我的输入包含html标记,例如:datadata(全部在一行上),我想删除数据位,该怎么办?我已经尝试了上述方法(将substr替换为^data^,但返回空文件?在Windows 7计算机上,它通过将set substr=disposed
替换为set“substr=^data^”
(如果可能,请继续使用变量substr
,而不是在for/f
中直接替换substr
)。由于特殊字符
,substr
变量的赋值必须用双引号括起来。此外,如果输入文件包含特殊字符,则必须使用延迟扩展。您帮助我记住了我忘记的一个小细节:脚本末尾的EndLocal
(即使省略也不成问题)。我已经对我的帖子进行了编辑(添加了备注)。希望这对你的html标记有帮助!谢谢……只要删除空行没有问题。@JesseChisholm不幸的是,for/f
命令跳过了空行。这就是它的设计方式。存在一些问题(hacky)解决方法使用findstr
或find
在执行for/f
之前,在每行(包括空行)前面加上行号和其他字符,但需要对行进行一些额外的处理。例如,请参阅。
@echo off
SetLocal EnableDelayedExpansion
set input=text1.txt
set output=text2.txt
set "substr=unwanted"
(
FOR /F "usebackq delims=" %%G IN ("%input%") DO (
set line=%%G
echo. !line:%substr%=!
)
) > "%output%"
EndLocal
exit /b 0