Batch file 批处理脚本-从文本文件中删除特定行
假设有两个文件Temp1和Temp2包含以下数据= Temp1.txt:Batch file 批处理脚本-从文本文件中删除特定行,batch-file,automation,Batch File,Automation,假设有两个文件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 要求删除Tem
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
)
但是,我认为这段代码将保留匹配的数据,而不是删除。需要更正。您甚至不需要为此编写脚本。这是一个命令:
findstr /x /v /G:temp2.txt temp1.txt >temp.txt
/x比较整条线
/v只打印不匹配的行
/g使用文件temp2.txt获取搜索字符串您甚至不需要脚本。这是一个命令:
findstr /x /v /G:temp2.txt temp1.txt >temp.txt
/x比较整条线
/v只打印不匹配的行
/g使用文件temp2.txt来获取searchstrings,FINDSTR本身应该是一个很好的解决方案。阅读文档时,人们会认为下面的文字搜索应该可以工作
findstr /vlxg:"temp2.txt" "temp1.txt" >temp.txt
但以下情况会使上述情况变得不可靠
缺陷
文字搜索可能需要\和/或转义为\\和\
解决方案是执行正则表达式搜索。但这要求必须转义temp2.txt中的正则表达式元字符。这对我来说是一个完美的任务。BAT是一个混合JScript/批处理脚本,从XP开始在任何Windows机器上本机运行
jrepl "[.*^$[\\]" "\$&" /f "temp2.txt"|findstr /rvxg:/ "temp1.txt" >"temp.txt"
以上工作如下
JREPL命令转义temp2.txt中的元字符,并通过管道将输出传输到FINDSTR
FINDSTR/R选项将所有搜索字符串视为正则表达式
/V选项会抑制匹配行,并打印非匹配行
/X选项意味着搜索字符串必须与整行匹配
/G:/option指示FINDSTR从管道中的stdin读取搜索字符串
JREPL | FINDSTR解决方案具有以下限制,所有这些都是由于FINDSTR行为造成的
temp2.txt中的所有行都必须是FINDSTR本身应该是一个很好的解决方案。阅读文档时,人们会认为下面的文字搜索应该可以工作
findstr /vlxg:"temp2.txt" "temp1.txt" >temp.txt
但以下情况会使上述情况变得不可靠
缺陷
文字搜索可能需要\和/或转义为\\和\
解决方案是执行正则表达式搜索。但这要求必须转义temp2.txt中的正则表达式元字符。这对我来说是一个完美的任务。BAT是一个混合JScript/批处理脚本,从XP开始在任何Windows机器上本机运行
jrepl "[.*^$[\\]" "\$&" /f "temp2.txt"|findstr /rvxg:/ "temp1.txt" >"temp.txt"
以上工作如下
JREPL命令转义temp2.txt中的元字符,并通过管道将输出传输到FINDSTR
FINDSTR/R选项将所有搜索字符串视为正则表达式
/V选项会抑制匹配行,并打印非匹配行
/X选项意味着搜索字符串必须与整行匹配
/G:/option指示FINDSTR从管道中的stdin读取搜索字符串
JREPL | FINDSTR解决方案具有以下限制,所有这些都是由于FINDSTR行为造成的
temp2.txt中的所有行都必须为空。这应该与/L开关一起工作,但这是不可靠的!请参阅为什么不能使用简单的FINDSTR命令。添加/L开关时应该可以这样做,但这是不可靠的!请参阅为什么不能使用简单的FINDSTR命令。