我有一個文本文件(test.txt的)一些數據刪除字符串的一部分,閱讀:在文件中使用批處理
wantedunwanteddata
我想刪除該字符串輸出,其餘的「無用」的一部分(即在另一個文件(的test2.txt「wanteddata」),我使用的是:
findstr /v "unwanted" test.txt>test2.txt
但多數民衆贊成返回一個空文件
我有一個文本文件(test.txt的)一些數據刪除字符串的一部分,閱讀:在文件中使用批處理
wantedunwanteddata
我想刪除該字符串輸出,其餘的「無用」的一部分(即在另一個文件(的test2.txt「wanteddata」),我使用的是:
findstr /v "unwanted" test.txt>test2.txt
但多數民衆贊成返回一個空文件
爲什麼findstr /v "unwanted" test.txt>test2.txt
將無法正常工作的原因是因爲findstr
搜索行符合您給它的條件。 findstr
將不會返回符合條件但符合條件的整個行的子字符串。在findstr /v "unwanted" test.txt>test2.txt
中,您要求中的所有行test.txt
沒有「不需要的」。這就是爲什麼test2.txt
是空的:沒有這樣的線。
在批處理,您可以從以下語法變量的值替換字符串的所有出現:%var:substr=repl%
。這將替換所有出現substr
與repl
中包含的字符串%var%
。由於刪除子字符串類似於用空字符串替換(至少在此情況下),因此您可以使用%var:substr=%
刪除substr
的所有發生。
如果你想刪除的子串的所有出現在一個文件,你可以用for /f
讀取該文件的每一行中的變量,並從中取出子後打印出該變量。請注意,由於我們將不得不在同一個for /f
塊中使用一個變量,因爲我們創建該變量的變量將包含delayed expansion(this 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
(分別爲input
和output
)無引號(當使用變量加引號)。如果需要,這將更容易地更改它們。
圍繞for /f
的額外(..)
僅用於處理輸出重定向到輸出文件。
如果您不想使用延遲擴展,則可以省略SetLocal EnableDelayedExpansion
和EndLocal
,並用for /f
內的call echo %%line:%substr%=%%
替換echo !line:%substr%=!
。
編輯:如果您的輸入文件中包含像<>()|&%
特殊字符,你必須使用延遲擴展。隨着call echo %%line:%substr%=%%
使用的正常變量擴展這些特殊字符將與由CMD-解釋器(<
和>
爲input or output redirection例如)它們的特殊含義進行處理併產生意外的結果。
此外,我已經包含substr
變量的賦值,但如果您要替換的子字符串包含特殊字符(如<>()|&%
),則它們每個都必須同時轉義才能使%substr%
按預期工作。你可以逃避特殊字符用脫字符號^
,除了必須加倍%
(%%
而不是%
)。
謝謝,@ J.Baoby!這工作完美。還有一個問題 - 如果我的輸入包含html標記,那麼如何:數據 數據 (全部在一行中),我想刪除數據位 位。我已經嘗試了上述(替換substr與^ 數據^ ,但返回一個空文件? –
user3552829
它在Windows 7機器上通過用'set'substr =^數據替換'set substr = unwanted'^ 「'(如果可能,繼續使用變量'substr'而不是直接替換'for/f'內的'substr')。由於特殊字符'<>','substr'變量的賦值必須如果你的輸入文件包含特殊字符,你將不得不使用延遲擴展,你已經幫助我記住了我忘記的一些細節:腳本末尾的「EndLocal」(偶數雖然它的遺漏不應該是一個問題) –
我已經編輯了我的文章(添加了一條評論)。希望這有助於您的html標籤 –