批处理脚本 - 从文本文件中删除特定行

时间:2015-04-08 15:20:03

标签: 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

要求删除(在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
)

但是,我认为此代码将保留匹配数据,而不是删除。需要纠正。

2 个答案:

答案 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行为

  • 即使在转义了元字符后,temp2.​​txt中的所有行都必须是< = 511个字符
  • temp1.txt中的所有行必须以\ r \ n(回车换行)
  • 终止
  • \ r必须不会出现在temp1.txt中除行尾之外的任何地方。

如果您下载GNU grep for Windows - 标准unix实用程序的端口,则可以消除这些限制并且解决方案更加简单。

grep -x -v -F -f "temp2.txt" "temp1.txt" >"temp.txt"