[英]Remove multi-line strings from a text file using a batch script
我試圖創建一個批處理文件,將編輯一個文本文件中刪除包含某個字符串,並直接后刪除行線。 此文件的示例如下所示:
LINE ENTRY KEEP_1 BLA BLA END LINE ENTRY REMOVE_1 FOO BAR END LINE ENTRY REMOVE_2 HELLO WORLD END LINE ENTRY KEEP_2 CAT DOG END
運行批處理腳本后,我需要包含新文件
LINE ENTRY KEEP_1 BLA BLA END LINE ENTRY KEEP_2 CAT DOG END
刪除包含REMOVE_的任何行,以及相應的“END”行。
我嘗試使用此處的技術刪除包含字符串的行,但似乎不可能包含\\ r \\ n等字符來檢查並在搜索中包含“END”。 我不能這樣做2個單獨的FINDSTR命令,因為我仍然需要為其他兩個條目保留'END'文本。
使用findstr /v REMOVE_
給我留下以下內容:
LINE ENTRY KEEP_1 BLA BLA END END END LINE ENTRY KEEP_2 CAT DOG END
並使用findstr /v "REMOVE_*\\r\\nEnd"
似乎根本不起作用。 只是為了確認每一行肯定以\\r\\n
。
任何有關這個問題的幫助將不勝感激。
以下批處理腳本應該執行您想要的操作:
@echo off
setlocal enabledelayedexpansion
set /A REMOVE_COUNT=1
if "%~2"=="" (
echo Usage: %~n0 search_str file
echo remove lines that contain a search_str and remove %REMOVE_COUNT% line^(s^) directly after that
exit /b 1
)
set "SEARCH_STR=%~1"
set "SRC_FILE=%~2"
set /A SKIP_COUNT=0
for /F "skip=2 delims=[] tokens=1,*" %%I in ('find /v /n "" "%SRC_FILE%"') do (
if !SKIP_COUNT! EQU 0 (
set SRC_LINE=%%J
if defined SRC_LINE (
if "!SRC_LINE:%SEARCH_STR%=!" == "!SRC_LINE!" (
echo.!SRC_LINE!
) else (
set /A SKIP_COUNT=%REMOVE_COUNT%
)
) else (
rem SRC_LINE is empty
echo.
)
) else (
set /A SKIP_COUNT-=1
)
)
可以通過設置REMOVE_COUNT
變量來配置匹配行之后要刪除的行數。
該腳本還使用技巧正確處理空行的文件:find命令用於為所有行添加行號。 這樣,for命令不會跳過空行。
findstr
行操作。 你不能做任何超過一行的事情。
無論如何,如果使用批處理文件執行此操作,您將陷入痛苦的世界。 雖然你當然可以遍歷文件並只輸出某些行,但這看起來有點像下面這樣:
set remove=
for /f %%x in (file.txt) do (
if not defined remove (
echo %%x|findstr "REMOVE" >nul 2>&1 && set remove=1
if not defined remove echo.%%x
) else (
set remove=
)
)
(未經測試,但可能有效)。 這里的問題有兩個: for /f
從輸出中刪除任何空行,所以如果你的文件有它們之后你就不會有它們。 對於您的具體情況,這可能是也可能不是問題。 另一個問題是處理特殊字符會變得毛茸茸。 我不保證上面的內容適用於>
, <
, &
, |
,...
在這種情況下,如果你需要在幾乎任何Windows機器上運行它,最好的選擇可能是VBScript。 字符串處理功能在那里更加強大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.