我在文本文件 (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
中创建一个变量- block 并在同一个 block 内使用它,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
我已经设置(路径到)你的输入文件 text1.txt
和你的输出文件 text2.txt
在变量中(分别为 input
和 output
)没有引号(使用变量时添加引号)。如果需要,这样可以更轻松地更改它们。
额外的 (..)
周边for /f
仅用于处理输出重定向到输出文件。
如果你不想使用延迟扩展,你可以省略 SetLocal EnableDelayedExpansion
和 EndLocal
并替换 echo !line:%substr%=!
与 call echo %%line:%substr%=%%
在for /f
里面.
编辑:如果您的输入文件包含特殊字符,如 <>()|&%
,您必须使用延迟扩展。使用 call echo %%line:%substr%=%%
中使用的正常变量扩展这些特殊字符将由 cmd 解释器以其特殊含义处理(例如 <
和 >
为 input or output redirection)并产生意想不到的结果。
我也已经包围了 substr
的分配。变量,但如果您要替换的子字符串包含特殊字符,如 <>()|&%
为了 %substr%
也必须对它们中的每一个进行转义按预期工作。您可以使用脱字符号转义特殊字符 ^
, 除了 %
必须加倍( %%
而不是 %
)。
EDIT2: for /f
跳过空行,因此如果想在输出文件中保留这些空行,则需要一些解决方法。处理纯批处理的一个常见技巧是使用 findstr /n
或 find /n
在将输入文件提供给 for /f
时,在每一行(包括空行)前添加行号.这当然需要一些额外的处理来处理 for /f
中的行号。阻止并从 for /f
的输出中删除它们但这是可能的。 This answer对类似问题的回答为这些解决方法及其缺点提供了很好的解释。
关于batch-file - 使用批处理删除文件中的部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42224177/