2017-02-14 106 views
0

我有一個文本文件(test.txt的)一些數據刪除字符串的一部分,閱讀:在文件中使用批處理

wantedunwanteddata 

我想刪除該字符串輸出,其餘的「無用」的一部分(即在另一個文件(的test2.txt「wanteddata」),我使用的是:

findstr /v "unwanted" test.txt>test2.txt 

但多數民衆贊成返回一個空文件

回答

2

爲什麼findstr /v "unwanted" test.txt>test2.txt將無法​​正常工作的原因是因爲findstr搜索符合您給它的條件。 findstr將不會返回符合條件但符合條件的整個行的子字符串。在findstr /v "unwanted" test.txt>test2.txt中,您要求中的所有行test.txt沒有「不需要的」。這就是爲什麼test2.txt是空的:沒有這樣的線。

在批處理,您可以從以下語法變量的值替換字符串的所有出現:%var:substr=repl%。這將替換所有出現substrrepl中包含的字符串%var%。由於刪除子字符串類似於用空字符串替換(至少在此情況下),因此您可以使用%var:substr=%刪除substr的所有發生。

如果你想刪除的子串的所有出現在一個文件,你可以用for /f讀取該文件的每一行中的變量,並從中取出子後打印出該變量。請注意,由於我們將不得不在同一個for /f塊中使用一個變量,因爲我們創建該變量的變量將包含delayed expansionthis answer解釋了原因)。

@echo off 
SetLocal EnableDelayedExpansion 

set input=text1.txt 
set output=text2.txt 
set "substr=unwanted" 

(
    FOR /F "usebackq delims=" %%G IN ("%input%") DO (
     set line=%%G 
     echo. !line:%substr%=! 
    ) 
) > "%output%" 

EndLocal 
exit /b 0 

我已經設置(路徑)您inputfile中text1.txt和你的變量OUTPUTFILE text2.txt(分別爲inputoutput)無引號(當使用變量加引號)。如果需要,這將更容易地更改它們。
圍繞for /f的額外(..)僅用於處理輸出重定向到輸出文件。
如果您不想使用延遲擴展,則可以省略SetLocal EnableDelayedExpansionEndLocal,並用for /f內的call echo %%line:%substr%=%%替換echo !line:%substr%=!

編輯:如果您的輸入文件中包含像<>()|&%特殊字符,你必須使用延遲擴展。隨着call echo %%line:%substr%=%%使用的正常變量擴展這些特殊字符將與由CMD-解釋器(<>input or output redirection例如)它們的特殊含義進行處理併產生意外的結果。
此外,我已經包含substr變量的賦值,但如果您要替換的子字符串包含特殊字符(如<>()|&%),則它們每個都必須同時轉義才能使%substr%按預期工作。你可以逃避特殊字符用脫字符號^,除了必須加倍%%%而不是%)。

+0

謝謝,@ J.Baoby!這工作完美。還有一個問題 - 如果我的輸入包含html標記,那麼如何:數據數據(全部在一行中),我想刪除數據位位。我已經嘗試了上述(替換substr與^ 數據^,但返回一個空文件? – user3552829

+0

它在Windows 7機器上通過用'set'substr =^數據替換'set substr = unwanted'^「'(如果可能,繼續使用變量'substr'而不是直接替換'for/f'內的'substr')。由於特殊字符'<>','substr'變量的賦值必須如果你的輸入文件包含特殊字符,你將不得不使用延遲擴展,你已經幫助我記住了我忘記的一些細節:腳本末尾的「EndLocal」(偶數雖然它的遺漏不應該是一個問題) –

+0

我已經編輯了我的文章(添加了一條評論)。希望這有助於您的html標籤 –

相關問題