我正在尝试创建一个批处理文件,该文件将编辑文本文件以删除包含某个字符串的行并之后直接删除该行。 此文件的示例如下所示:
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”行。
我尝试使用here找到的技术删除包含字符串的行,但似乎不能包含\ 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
终止的。
非常感谢有关此问题的任何帮助。
答案 0 :(得分:3)
以下批处理脚本应该执行您想要的操作:
@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命令不会跳过空行。
答案 1 :(得分:1)
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。字符串处理功能在那里更加强大。