使用批处理脚本从文本文件中删除多行string

我正在尝试创build一个batch file,它将编辑一个文本文件以删除包含特定string的行,然后直接删除该行。 这个文件的例子看起来像这样:

 LINE ENTRY KEEP_1 BLA BLA
结束
 LINE ENTRY REMOVE_1 FOO BAR
结束
 LINE ENTRY REMOVE_2 HELLO WORLD
结束
 LINE ENTRY KEEP_2 CAT DOG
结束

在运行批处理脚本之后,我需要包含新文件

 LINE ENTRY KEEP_1 BLA BLA
结束
 LINE ENTRY KEEP_2 CAT DOG
结束

其中包含REMOVE_的任何行都被删除,以及相应的“END”行。

我已经尝试使用这里find的技术来删除包含string的行,但似乎不可能包含\ r \ n等字符来检查并在search中包含“END”。 我不能做到这一点,作为2个单独的FINDSTR命令,因为我仍然需要为其他两个条目保留“结束”文本。
使用findstr /v REMOVE_留下以下内容:

 LINE ENTRY KEEP_1 BLA BLA
结束
结束
结束
 LINE ENTRY KEEP_2 CAT DOG
结束

并使用findstr /v "REMOVE_*\r\nEnd"似乎并没有工作。 只是确认每一行肯定是以\r\n结尾的。

任何有关这个问题的帮助将不胜感激。

Solutions Collecting From Web of "使用批处理脚本从文本文件中删除多行string"

下面的批处理脚本应该做你想要的:

 @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。 字符串处理功能在这里更加健壮。