Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用批处理删除文件中的部分字符串_Batch File_Findstr - Fatal编程技术网

Batch file 使用批处理删除文件中的部分字符串

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将不返回与条件匹配的子字符串,而是返回

我在一个文本文件(test.txt)中有一些数据,如下所示:

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