2016-11-10 5 views
0

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

ac.txt файлов имеют следующую структуру:

Я хочу получить все эти строки между строками [огни] и [GetEngineData] (включая те, которые запускают [огни] и заканчивают [линии GetEngineData]) в одном файле вывода с именем lights.txt с пустым пространством в между теми, которые поступают из каждого текстового файла.

Я кодируются следующим партия пока это не помогло до сих пор:

@ECHO OFF 
for /r %%a in ('find /n "[lights]"^<(ac.txt) ') do set /a start=%%a 
for /r %%a in ('find /n "[GeneralEngineData]"^<(ac.txt) ') do set /a end=%%a 
(
    for /r %%a in ('find /n /v ""^<(ac.txt) ') do (
     IF %%a geq %start% IF %%f leq %end% ECHO(%%b 
    ) 
)>lights.txt 
+1

Вы не можете использовать 'FOR/R' для обработки вывода команды. Используйте 'FOR/F' для этого. Я не уверен, что вы пытаетесь сделать с помещением маски файла в круглые скобки. – Squashman

+1

Возможный дубликат [Пакетный файл - найдите две строки, затем скопируйте все между этими линиями] (http://stackoverflow.com/questions/33638832/batch-file-find-two-lines-then-copy-everything-between-those -lines) – aschipfl

+0

Вы заявили, что ваши текстовые файлы были «все названы одинаковыми», так почему вы смотрите в каждом файле с расширением .txt, а не только в файле knownfilename.txt? – Compo

ответ

0

Вот способ сделать это. Может быть, не самый эффективный, но, похоже, он отлично справляется с этой задачей. Код перемещается по всем подпапкам и подбирает все файлы .TXT. Затем он анализирует каждую строку каждого файла, отмечая начало/конец каждого блока с помощью токенови [GeneralEngineData], а затем выводит все на res.txt в той же папке, где хранится командный файл.

@ECHO OFF 
Setlocal EnableDelayedExpansion 
if exist res.txt del res.txt 

set inblock=0 
for /r . %%a in (*.txt) do (
    set fname=%%a 
    for /f "tokens=1* delims=]" %%b in ('type "!fname!" ^| find /n /v ""') do (
     if /i *%%c*==*[lights]* set inblock=1 
     if !inblock!==1 (
      if *%%c*==** (echo.) else (echo %%c) 
      if /i *%%c*==*[GetEngineData]* set inblock=0 
     ) 
    ) 
    echo. 
) >> res.txt 
set fname= 
set inblock= 
type res.txt 
+0

Я дам ему скоро – kvari

+0

, что один отлично работает, спасибо! просто добавили '/ i' в выражения' if', чтобы игнорировать любую вероятную чувствительность к регистру. – kvari

+0

, он не может добавить набор данных между '[lights]' и '[GeneralEngineData]' в случае, если есть пустая строка сразу после '[lights]' lines. – kvari

 Смежные вопросы

  • Нет связанных вопросов^_^