簡體   English   中英

使用批處理腳本從文本文件中刪除多行字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM