2017-02-14 63 views
0

我有一个文本文件(test.txt的)一些数据删除字符串的一部分,阅读:在文件中使用批处理

wantedunwanteddata 

我想删除该字符串输出,其余的“无用”的一部分(即在另一个文件(的test2.txt“wanteddata”),我使用的是:

findstr /v "unwanted" test.txt>test2.txt 

但多数民众赞成返回一个空文件

回答

2

为什么findstr /v "unwanted" test.txt>test2.txt将无法​​正常工作的原因是因为findstr搜索符合您给它的条件。 findstr将不会返回符合条件但符合条件的整个行的子字符串。在findstr /v "unwanted" test.txt>test2.txt中,您要求中的所有行test.txt没有“不需要的”。这就是为什么test2.txt是空的:没有这样的线。

在批处理,您可以从以下语法变量的值替换字符串的所有出现:%var:substr=repl%。这将替换所有出现substrrepl中包含的字符串%var%。由于删除子字符串类似于用空字符串替换(至少在此情况下),因此您可以使用%var:substr=%删除substr的所有发生。

如果你想删除的子串的所有出现在一个文件,你可以用for /f读取该文件的每一行中的变量,并从中取出子后打印出该变量。请注意,由于我们将不得不在同一个for /f块中使用一个变量,因为我们创建该变量的变量将包含delayed expansionthis 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(分别为inputoutput)无引号(当使用变量加引号)。如果需要,这将更容易地更改它们。
围绕for /f的额外(..)仅用于处理输出重定向到输出文件。
如果您不想使用延迟扩展,则可以省略SetLocal EnableDelayedExpansionEndLocal,并用for /f内的call echo %%line:%substr%=%%替换echo !line:%substr%=!

编辑:如果您的输入文件中包含像<>()|&%特殊字符,你必须使用延迟扩展。随着call echo %%line:%substr%=%%使用的正常变量扩展这些特殊字符将与由CMD-解释器(<>input or output redirection例如)它们的特殊含义进行处理并产生意外的结果。
此外,我已经包含substr变量的赋值,但如果您要替换的子字符串包含特殊字符(如<>()|&%),则它们每个都必须同时转义才能使%substr%按预期工作。你可以逃避特殊字符用脱字符号^,除了必须加倍%%%而不是%)。

+0

谢谢,@ J.Baoby!这工作完美。还有一个问题 - 如果我的输入包含html标记,那么如何:数据数据(全部在一行中),我想删除数据位位。我已经尝试了上述(替换substr与^ 数据^,但返回一个空文件? – user3552829

+0

它在Windows 7机器上通过用'set'substr =^数据替换'set substr = unwanted'^“'(如果可能,继续使用变量'substr'而不是直接替换'for/f'内的'substr')。由于特殊字符'<>','substr'变量的赋值必须如果你的输入文件包含特殊字符,你将不得不使用延迟扩展,你已经帮助我记住了我忘记的一些细节:脚本末尾的“EndLocal”(偶数虽然它的遗漏不应该是一个问题) –

+0

我已经编辑了我的文章(添加了一条评论)。希望这有助于您的html标签 –

相关问题