2011-03-17 74 views
2

我有一個存儲在名爲blacklist.txt的文本文件中的單詞列表我想通過另一個程序的輸出並取出包含這些單詞的所有行。批處理文件查找解析出關鍵字

如果我這樣做:

for /f %%G in (blacklist.txt) find /v /i "%%G" output.txt > newoutput.txt 

我只得到了結果形成最後找到

如果我這樣做:

for /f %%G in (blacklist.txt) find /v /i "%%G" output.txt > output.txt 

我希望它更新文件和運行下一個查找系統地過濾掉所有列入黑名單的字符串。然而,情況並非如此,在第二次查找運行後,文件變爲空白...

有沒有人嘗試過類似於此之前做過的事情?

回答

1
for /f %%g in (blacklist.txt) do (
    find /v /i "%1" <output.txt >tmp 
    move tmp output.txt 
) 

注意,讓find從標準輸入讀取意味着你不會得到虛假---------- output.txt線出現在輸出。

+0

那也很漂亮我會在完成我想要做的整個過程的測試運行之後給出一個去。謝謝一堆! – MilqueToasted 2011-03-17 20:34:00

1

如果要附加到文件,請將>更改爲>>。另外,刪除文件名前的空格。

for /f %%G in (blacklist.txt) find /v /i "%%G" output.txt >>newoutput.txt 
+0

問題是我希望它覆蓋後每發現讓我最終只能從output.txt的線路不包含任何字符串中blacklist.txt ......如果我的文件追加它我結束了在一個文件和一個更大的列表中的所有不同的查找結果比我開始與 – MilqueToasted 2011-03-17 19:27:18

0

使用>>而不是>
只是不要忘了刪除輸出文件的第二輪,將>>始終追加到現有文件 你不能重定向到同一文件作爲輸入,這是不支持在windows下的cmd.exe

+0

,因爲我做了一個沒有找到附加到文件只是最終幾乎所有output.txt多次列出... 。但知道我不能重定向到輸入文件相同的文件解釋了爲什麼我得到一個空白的文件...必須有一些方法來保持我的列表更小,因爲我編輯每個列入黑名單的單詞。 – MilqueToasted 2011-03-17 19:33:25

+0

好的,我明白了,真正的問題有點隱藏...... – BertV 2011-03-17 19:41:05

+0

如何在'for'中使用'call'語句,並在被調用的塊中對臨時文件執行查找操作,然後移動臨時文件到輸入文件,所以下一次迭代操作前一個的結果。 (是的,我迅速按下了回車鍵...) – BertV 2011-03-17 19:42:56

2

這是我的意思。將以下內容放入批處理文件並運行:

for /f %%G in (blacklist.txt) do call :finder %%G 
goto :EOF 

:finder 
find /v /i "%1" output.txt > output.tmp 
copy output.tmp output.txt 

output.txt將包含不匹配的行。它還將包含多次輸入文件的名稱。爲了避免這種情況,可以使用findstr而不是find命令。

+0

再次感謝。 :) – MilqueToasted 2011-03-17 20:28:31

+0

你不必從'find'切換。使用輸入重定向:'find/v/i「%1」 output.tmp'。 – 2011-03-17 21:08:08

1

嗯。我注意到findstr同時具有/v/g:file。這意味着你可以忘記for循環。

findstr /v /l /g:blacklist.txt output.txt >tmp 
move tmp output.txt