2015-04-08 236 views
1

假設有兩個文件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

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 /批處理腳本,可以在任何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" 
2

你甚至不需要這個腳本。這是一個簡單的命令:

findstr /x /v /G:temp2.txt temp1.txt >temp.txt 

/x比較全行

/v僅打印線,不符合

/g使用文件(temp2.​​txt)來獲得searchstrings

+0

這應該與添加/ L開關一起使用,但它是不可靠的!請參閱[我的答案](http://stackoverflow.com/a/29520063/1012053)爲什麼不能使用簡單的FINDSTR命令。 – dbenham

相關問題