我正在尝试创建一个批处理文件,该文件将编辑文本文件以删除包含特定字符串的行and之后直接删除该行。
该文件的示例如下所示:
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 https://stackoverflow.com/questions/418916/delete-certain-lines-in-a-txt-file-via-a-batch-file删除包含该字符串的行,但似乎不可能包含 \r\n 等字符来检查并在搜索中包含“END”。我不能将其作为 2 个单独的 FINDSTR 命令来执行,因为我仍然需要为其他两个条目保留“END”文本。
Using 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 命令就不会跳过空行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)