我有一个文本文件(test.txt的)一些数据删除字符串的一部分,阅读:在文件中使用批处理
wantedunwanteddata
我想删除该字符串输出,其余的“无用”的一部分(即在另一个文件(的test2.txt“wanteddata”),我使用的是:
findstr /v "unwanted" test.txt>test2.txt
但多数民众赞成返回一个空文件
我有一个文本文件(test.txt的)一些数据删除字符串的一部分,阅读:在文件中使用批处理
wantedunwanteddata
我想删除该字符串输出,其余的“无用”的一部分(即在另一个文件(的test2.txt“wanteddata”),我使用的是:
findstr /v "unwanted" test.txt>test2.txt
但多数民众赞成返回一个空文件
为什么findstr /v "unwanted" test.txt>test2.txt
将无法正常工作的原因是因为findstr
搜索行符合您给它的条件。 findstr
将不会返回符合条件但符合条件的整个行的子字符串。在findstr /v "unwanted" test.txt>test2.txt
中,您要求中的所有行test.txt
没有“不需要的”。这就是为什么test2.txt
是空的:没有这样的线。
在批处理,您可以从以下语法变量的值替换字符串的所有出现:%var:substr=repl%
。这将替换所有出现substr
与repl
中包含的字符串%var%
。由于删除子字符串类似于用空字符串替换(至少在此情况下),因此您可以使用%var:substr=%
删除substr
的所有发生。
如果你想删除的子串的所有出现在一个文件,你可以用for /f
读取该文件的每一行中的变量,并从中取出子后打印出该变量。请注意,由于我们将不得不在同一个for /f
块中使用一个变量,因为我们创建该变量的变量将包含delayed expansion(this answer解释了原因)。
@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
我已经设置(路径)您inputfile中text1.txt
和你的变量OUTPUTFILE text2.txt
(分别为input
和output
)无引号(当使用变量加引号)。如果需要,这将更容易地更改它们。
围绕for /f
的额外(..)
仅用于处理输出重定向到输出文件。
如果您不想使用延迟扩展,则可以省略SetLocal EnableDelayedExpansion
和EndLocal
,并用for /f
内的call echo %%line:%substr%=%%
替换echo !line:%substr%=!
。
编辑:如果您的输入文件中包含像<>()|&%
特殊字符,你必须使用延迟扩展。随着call echo %%line:%substr%=%%
使用的正常变量扩展这些特殊字符将与由CMD-解释器(<
和>
为input or output redirection例如)它们的特殊含义进行处理并产生意外的结果。
此外,我已经包含substr
变量的赋值,但如果您要替换的子字符串包含特殊字符(如<>()|&%
),则它们每个都必须同时转义才能使%substr%
按预期工作。你可以逃避特殊字符用脱字符号^
,除了必须加倍%
(%%
而不是%
)。
谢谢,@ J.Baoby!这工作完美。还有一个问题 - 如果我的输入包含html标记,那么如何:数据 数据 (全部在一行中),我想删除数据位 位。我已经尝试了上述(替换substr与^ 数据^ ,但返回一个空文件? –
user3552829
它在Windows 7机器上通过用'set'substr =^数据替换'set substr = unwanted'^ “'(如果可能,继续使用变量'substr'而不是直接替换'for/f'内的'substr')。由于特殊字符'<>','substr'变量的赋值必须如果你的输入文件包含特殊字符,你将不得不使用延迟扩展,你已经帮助我记住了我忘记的一些细节:脚本末尾的“EndLocal”(偶数虽然它的遗漏不应该是一个问题) –
我已经编辑了我的文章(添加了一条评论)。希望这有助于您的html标签 –