假设有两个文件Temp1& Temp2包含以下数据=
Temp1.txt:
xxxx xxxxx xxxxxxxx xxxxx xxxxx
yyyyy yyyy yyy yyyyyyy yyyy yyy
zz zzzzz zz zzzz zzz zzz zz z z
Temp2.txt:
xxxx xxxxx xxxxxxxx xxxxx xxxxx
zz zzzzz zz zzzz zzz zzz zz z z
aaaa aa aaaa aa aaaaa aaa aaaaaa
要求删除(在Temp1中)与Temp2匹配的行。并可能将其保存在不同的文件中。 所以,基本上输出应该是这样的:
Temp.txt:
yyyyy yyyy yyy yyyyyyy yyyy yyy
这是我到目前为止所得到的:
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "Delims=" %%A IN ('type "Temp2.txt"') DO (
SET STRING=%%A
FINDSTR /V /C:%STRING% "Temp1.txt" > Temp.txt
)
但是,我认为此代码将保留匹配数据,而不是删除。需要纠正。
答案 0 :(得分:2)
你甚至不需要一个脚本。这只是一个命令:
findstr /x /v /G:temp2.txt temp1.txt >temp.txt
/x
比较整行
/v
仅打印与
/g
使用文件(temp2.txt)来获取搜索字符串
答案 1 :(得分:2)
FINDSTR本身应该是一个很好的解决方案。阅读文档,人们会认为以下文字搜索应该有效。
findstr /vlxg:"temp2.txt" "temp1.txt" >temp.txt
但是以下FINDSTR bugs and limitations阻止了上述内容的可靠性
\
和/或"
转发为\\
和\"
解决方案是进行正则表达式搜索。但这要求必须转义temp2.txt中的正则表达式元字符。这对我的JREPL.BAT regular expression find/replace utility来说是一个完美的任务。 JREPL.BAT是一个混合JScript /批处理脚本,可以在XP以后的任何Windows机器上本机运行。
jrepl "[.*^$[\\]" "\$&" /f "temp2.txt"|findstr /rvxg:/ "temp1.txt" >"temp.txt"
以上工作原理如下。
JREPL命令转义temp2.txt中的元字符,输出通过管道传输到FINDSTR
FINDSTR / R选项将所有搜索字符串视为正则表达式
/ V选项导致匹配线被抑制,并且打印不匹配的行
/ X选项表示搜索字符串必须与整行匹配
/ G:/选项指示FINDSTR从stdin(管道)读取搜索字符串
JREPL | FINDSTR解决方案具有以下限制,全部归因于FINDSTR行为
如果您下载GNU grep for Windows - 标准unix实用程序的端口,则可以消除这些限制并且解决方案更加简单。
grep -x -v -F -f "temp2.txt" "temp1.txt" >"temp.txt"