Отрезать блок на основе определенных строк в файле - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть задача обрезать блок, начиная с определенной строки в середине файла, а затем сохранить эту верхнюю часть файла в новый файл.

;---- Some text A
aaaaaaa1111
……..
aaaaaaa2222
;-----Some text B
bbbbbbbbb1111
………….. 
bbbbbbbbb2222

Теперь я ищудля пакетного файла, чтобы отрезать часть, начиная с:

;-----Some text B

Таким образом, после резки, новый файл выглядит так:

;---- Some text A
aaaaaaa1111
……..
aaaaaaa2222

Вся часть, начиная с:

;-----Some text B
bbbbbbbbb1111
………….. 
bbbbbbbbb2222

обрезано.

Я попытался использовать функцию из DOStip, а затем вызвать эту функцию, как показано ниже:

@ECHO OFF
REM.-- Prepare the Command Processor
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
echo.Extracting hello world block into "Load_SDK.M83" file
call:extractFromFile ";---- Some text A" ";---- Some text B">"Load_SDK.M83"
:extractFromFile - extract lines from a file between begin and end mark
:: - %~1: begin mark, use '...$' mark to allow variable substitution
:: - %~2: optional end mark, default is end of file
:: - %~3: optional source file, default is THIS file
SETLOCAL
set bmk=;---- Some text A
set emk=;---- Some text B
set src=C:\Files\Load_all.M83
set /a b=-1
set /a e=-1
if "%src%"=="" set src=%~f0& ::- if no source file then assume THIS file
for /f "tokens=1,* delims=:" %%a in ('"findstr /n /b /c:"%bmk%" "%~f0""') do (
    set b=%%a
    set bmk=%%b
)
if /i %b%==-1 echo.ERROR: begin mark '%bmk%' not found in '%src%'&GOTO:EOF
if "%emk%"=="" (set /a e=2000000000) ELSE (
    for /f "delims=:" %%a in ('"findstr /n /b /c:"%emk%" "%~f0""') do (
        if /i %b% LSS %%a if /i !e!==-1 set e=%%a& rem -- find only the first one after b
    )
)
if /i %e%==-1 echo.ERROR: end mark '%emk%' missing in '%src%'&GOTO:EOF
if /i %b% GEQ %e% echo.ERROR: end mark '%emk%' detected before begin mark '%bmk%' in '%src%'&GOTO:EOF
for /f "delims=: tokens=1,*" %%a in ('"findstr /v /n /b /c:"#$*ReturnAll*$#" "%src%""') do (
    if /i %b% LSS %%a if /i %%a LSS %e% (
        if "%bmk:~-1%"=="$" (
            rem --sustitution variables within %%b
            call echo.%%b
        ) ELSE (
            rem --no variable substitution
            echo.%%b
        )
    )
)
GOTO:EOF

1 Ответ

0 голосов
/ 27 ноября 2018

Судя по моему комментарию, однострочный цикл For с If и GoTo, кажется, выполняет задачу, как показано в вашем вопросе:

@(For /F UseBackQDelims^=^ EOL^= %%A In ("source.txt") Do @If /I Not "%%A"==";-----Some text B" (Set /P "=%%A"<Nul&Echo=) Else GoTo :EOF)>"result.txt"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...