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

标签 batch-file findstr

我在文本文件 (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% .这将替换所有出现的 substrrepl在字符串 %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在变量中(分别为 inputoutput )没有引号(使用变量时添加引号)。如果需要,这样可以更轻松地更改它们。
额外的 (..)周边for /f仅用于处理输出重定向到输出文件。
如果你不想使用延迟扩展,你可以省略 SetLocal EnableDelayedExpansionEndLocal并替换 echo !line:%substr%=!call echo %%line:%substr%=%%for /f里面.

编辑:如果您的输入文件包含特殊字符,如 <>()|&% ,您必须使用延迟扩展。使用 call echo %%line:%substr%=%% 中使用的正常变量扩展这些特殊字符将由 cmd 解释器以其特殊含义处理(例如 <>input or output redirection)并产生意想不到的结果。
我也已经包围了 substr 的分配。变量,但如果您要替换的子字符串包含特殊字符,如 <>()|&%为了 %substr% 也必须对它们中的每一个进行转义按预期工作。您可以使用脱字符号转义特殊字符 ^ , 除了 %必须加倍( %% 而不是 % )。

EDIT2: for /f跳过空行,因此如果想在输出文件中保留这些空行,则需要一些解决方法。处理纯批处理的一个常见技巧是使用 findstr /nfind /n在将输入文件提供给 for /f 时,在每一行(包括空行)前添加行号.这当然需要一些额外的处理来处理 for /f 中的行号。阻止并从 for /f 的输出中删除它们但这是可能的。 This answer对类似问题的回答为这些解决方法及其缺点提供了很好的解释。

关于batch-file - 使用批处理删除文件中的部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42224177/

相关文章:

windows - 如何使用 ExecDos 命令隐藏命令提示符窗口

batch-file - 使用 Rasphone 和 | 连接 VPN |批处理文件中的命令

batch-file - 错误 "| was unexpected at this time."

regex - 在批处理脚本中打印第二个标记之后的所有标记

windows - FINDSTR : help understanding results. Returns nothing, but no error when there is one expected?

Windows 服务器上的 Java,bat 运行包

batch-file - 编写一个打开 chrome URL 的批处理文件

windows - 批处理脚本 - 等到网络建立

batch-file - 管道查找findstr的输入