Major Edit - я тестировал и отлаживал свой код.Было много ошибок.
Я думаю, это должно вас сблизить.Но я все еще не уверен, что понимаю ваше непустое условие.
Этот код изменит все файлы .TXT в текущем каталоге.Для каждого файла следует удалить первые 3 строки, последние 2 строки и все строки, содержащие [или].Любая строка, начинающаяся с: в 1-й позиции, будет иметь ведущее значение: stripped.
@echo off
for %%F in (*.txt) do (
for /f %%N in ('find /c /v "" ^<"%%F"') do set bottom1=%%N
set /a bottom2=bottom1-1
(
for /f "tokens=1* delims=:" %%A in (
'findstr /n "^" "%%F" ^| findstr /vr /c:"\[" /c:"\]" /c:"^1:" /c:"^2:" /c:"^3:" /c:"^%%bottom1%%:" /c:"^%%bottom2%%:"'
) do echo(%%B
)>"%%~nF.mod"
rem del "%%F"
rem ren "%%~nF.mod" "%%~nxF"
)
Как написано, исходный файл будет сохранен, а измененная версия будет иметь то же имя, но с расширением .mod.
Если результаты вас устраивают, вы можете удалить rem
с передней части последних 2 строк, и тогда ваши исходные файлы будут перезаписаны измененной версией.Если вы сделаете это изменение, убедитесь, что вы запускаете скрипт только один раз!
Первый FIND получает количество строк, поэтому мы знаем, какие строки нужно удалить снизу, основываясь на номере строки.
Интересным является большая длинная команда во втором цикле FOR.Первый FINDSTR префикс каждой строки с номером строки.Эти результаты затем передаются на второй FINDSTR, который удаляет соответствующие строки, основываясь на моем понимании ваших требований.
Он использует регулярные выражения.Например, «^ 1:» - это регулярное выражение, которое ищет «1:» в начале строки.
Двойные проценты используются для bottom1 и bottom2, чтобы мы могли получить доступ к текущим значениям без использования отложенного расширения.В родительском пакете %% bottom1 %% становится% bottom1%, который передается команде FINDSTR.Команды предложения FOR / F IN () выполняются в рамках их собственного сеанса CMD, поэтому он может правильно расширить текущее значение% bottom1%.
Поскольку используется параметр / v, FINDSTR сохраняет все строки, которыеНЕ соответствует ни одной из строк поиска регулярных выражений.Вы были на правильном пути в этом отношении.Просто эффективнее выполнять всю фильтрацию с помощью одного FINDSTR.
Параметры FOR / F устанавливаются для разбиения каждой строки на два токена с разрывом 1-го: в каждой строке.Только 2-й жетон напечатан.Вот как префикс номера строки удаляется из вывода.