foxidrive 显示的 FINDSTR 方法绝对是解决问题的最快的纯批处理方法,尤其是在 file2 很大的情况下。但是,有许多情况可能导致它失败:文件 1 中的正则表达式元字符、文件 1 中的引号和/或反斜杠等。请参阅Windows FINDSTR 命令的未记录功能和限制是什么?对于所有潜在的问题。更多的工作可以使解决方案更可靠。
- 应该明确地使搜索字面化
- 搜索应该是完全匹配的(整行)
- 搜索行中的任何反斜杠都应转义为
\\
- 每个搜索都应该存储在一个临时文件中,并且
\G:file
使用的选项
另外,您没有描述每一行的格式。由于and的默认delims
选项,您的 FOR /F 语句将只读取每行的第一个单词。我怀疑你想设置为空。您还希望禁用该选项,以便不跳过以开头的行。这需要一些看起来很奇怪的语法。我添加了该选项,以防您处理必须引用的文件名。<tab>
<space>
delims
eol
;
usebackq
@echo off
setlocal disableDelayedExpansion
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"
>"%file3%" (
for /f usebackq^ delims^=^ eol^= %%A in ("%file1%") do if "%%A" neq "" (
set "ln=%%A"
setlocal enableDelayedExpansion
(echo(!ln:\=\\!) >"%search%"
findstr /lxg:"%search%" "%file2%" >nul || (echo(!ln!)
endlocal
)
)
del "%search%" 2>nul
如果您的 file2 不包含\"
并且您可以进行不区分大小写的搜索,则有一个非常快速的单行解决方案:只需反转 FINDSTR 搜索以查找 file1 中不存在于文件 2 中的任何行。搜索必须是不区分大小写,因为为什么这个具有多个文字搜索字符串的 FINDSTR 示例找不到匹配项?.
findstr /livxg:"file2.txt" "file1.txt" >"file3.txt"
\"
如果 file2 包含由于转义问题,这将不起作用。您可以预处理 file2 并转义 all \
,但是如果您将自己限制为纯批处理解决方案,那么您不妨使用第一个解决方案。
如果您愿意使用名为 REPL.BAT 的混合 JScript/批处理实用程序,那么我有一个非常简单和有效的解决方案。REPL.BAT 对标准输入的每一行执行正则表达式搜索和替换操作,并将结果写入标准输出。
假设 REPL.BAT 在您当前的目录中,或者更好的是,在您的路径中的某个位置:
@echo off
setlocal
set "file1=file1.txt"
set "file2=file2.txt"
set "file3=file3.txt"
set "search=%temp%\search.txt"
type "%file2%"|repl \\ \\ >"%search%"
findstr /livxg:"%search%" "%file1%" >"%file3%"
del "%search%" 2>nul
请注意,此解决方案仍必须执行不区分大小写的比较。