Как найти строку в файле и скопировать найденную строку и следующую строку в другой файл?

У меня есть 2 строки в файле с именем database.txt. Одна строка содержит вопрос, а следующая строка ниже содержит ответ.

Например:

<--When did India get it's Independence?-->
India got it's independence on August 15th, 1947.

Если пользователь ищет When,India,Independence?, первая строка копируется в другой файл с именем result.txt. Но я хочу, чтобы были скопированы обе строки, вопрос и ответ.

Может ли кто-нибудь пролить свет здесь?


person blah    schedule 27.08.2014    source источник
comment
строки идут подряд?   -  person npocmaka    schedule 27.08.2014
comment
Вопрос и ответ идут последовательно. Однако после каждого сета есть разрыв. Каждый набор имеет тег вопроса и ответ, как указано выше.   -  person blah    schedule 27.08.2014
comment
Я отредактировал ваш вопрос для ясности. Не стесняйтесь отменить редактирование, если вы не согласны.   -  person indiv    schedule 27.08.2014
comment
Хаха спасибо. :) Любой? отвечать? :/   -  person blah    schedule 27.08.2014
comment
это stackoverflow.com/questions/5631752/ предполагает, что это выполнимо, но я думаю, вам лучше использовать порт Powershell или grep   -  person wmz    schedule 28.08.2014
comment
@wmz - grep не может выполнять поиск по нескольким строкам, а pcregrep может.   -  person dbenham    schedule 28.08.2014
comment
@dbenham Некоторые могут, как указано здесь: stackoverflow.com/questions/3717772/ (похоже, что порт gnuwin поддерживает все параметры) - но что более важно, многострочный поиск здесь не нужен - согласно требованию OP достаточно сопоставьте первую строку, а затем распечатайте (скопируйте) эту и следующую строку, что может легко сделать grep (с -A)   -  person wmz    schedule 28.08.2014
comment
@wmz - Извините, конечно, вы правы. Спасибо   -  person dbenham    schedule 28.08.2014
comment
Я должен сделать это только с помощью cmd без каких-либо сторонних надстроек. Это одно из ограничений.   -  person blah    schedule 28.08.2014
comment
Каждый вопрос разделен стрелками? <---question--->   -  person foxidrive    schedule 30.08.2014
comment
Да @foxidrive каждый вопрос.   -  person blah    schedule 01.09.2014


Ответы (2)


Раздел справки О каких темах здесь можно задать? всегда следует читать перед публикацией вопроса. Сообщество Stack Overflow не предназначено для выполнения всей работы по программированию за других. Похоже, вы не приложили никаких усилий для написания командного файла для своей задачи самостоятельно.

Но вам повезло, так как меня заинтересовала задача найти 1 или более строк в текстовом файле и скопировать найденные строки, а также 1 или более строк ниже каждой найденной строки в другой текстовый файл, используя только стандартные команды и приложения Windows.

Я обычно выполняю такие задачи с помощью текстового редактора UltraEdit с его мощным механизмом регулярных выражений Perl и поддержкой сценариев, и мне никогда бы не пришла в голову идея использовать пакетный файл для захвата строк из текстового файла и сохранения их в другом текстовом файле.

Вот общее решение пакетного файла с поясняющими комментариями для копирования найденных строк и от 2 до N (см. LineCount) последовательных строк под каждой найденной строкой из одного текстового файла в другой текстовый файл.

@echo off
setlocal EnableDelayedExpansion

rem Define the regular expression search string.
set "SearchExpression=When.*India.*Independence"

rem Define names of input and output file with full path.
set "ResultFile=C:\Temp\Result.txt"
set "SourceFile=C:\Temp\Example.txt"

rem Delete existing output file from a previous execution.
if exist "%ResultFile%" del "%ResultFile%"

rem Run a regular expression search in input file using standard Windows
rem console application FINDSTR with getting output also the line number
rem of the line with a positive match at beginning of the output line
rem and separated from the found line with a colon. Of interest in this
rem first loop is only the line number being processed in subroutine.
for /F "tokens=1 delims=:" %%N in ( '%SystemRoot%\System32\findstr.exe /R /N "%SearchExpression%" "%SourceFile%"' ) do (
    set SkipLines=%%N
    call :CopyLines
)
endlocal
goto :EOF

rem Subroutine to copy from input file the line with the positive match
rem of the regular expression search and also the next line in the file.
:CopyLines

rem Determine the number of lines to copy from input file to output file.
set LineCount=2
set SkipOption=

rem Skip all lines above the found line.
set /A SkipLines-=1

rem Option skip with value 0 results in a syntax error message.
rem Therefore define option skip only with a value greater 0.
if not "%SkipLines%" == "0" set "SkipOption=skip=%SkipLines% "

rem Copy LineCount lines starting from SkipLines+1 line to output file.
for /F "usebackq %SkipOption%delims=" %%L in ( "%SourceFile%" ) do (
   echo %%L>>"%ResultFile%"
   set /A LineCount-=1
   if "!LineCount!" == "0" goto :EOF
)

А вот еще один командный файл без комментариев, оптимизированный для копирования только каждой найденной строки и строки ниже из входного текстового файла в выходной.

@echo off
setlocal EnableDelayedExpansion
set "SearchExpression=When.*India.*Independence"
set "ResultFile=C:\Temp\Result.txt"
set "SourceFile=C:\Temp\Example.txt"
if exist "%ResultFile%" del "%ResultFile%"
for /F "tokens=1,2* delims=:" %%N in ( '%SystemRoot%\System32\findstr.exe /R /N "%SearchExpression%" "%SourceFile%"' ) do (
    set SkipLines=%%N
    echo %%O>>"%ResultFile%"
    call :CopyNextLine
)
endlocal
goto :EOF

:CopyNextLine
for /F "usebackq skip=%SkipLines% delims=" %%L in ( "%SourceFile%" ) do (
   echo %%L>>"%ResultFile%"
   goto :EOF
)
person Mofi    schedule 30.08.2014
comment
Проблема с этим решением заключается в том, что три условия поиска должны быть в той же последовательности, что и в исходном текстовом файле — например, вы не можете искать India перед When. - person foxidrive; 01.09.2014

Вспомогательный пакетный файл, используемый ниже, использует собственные методы пакетной обработки и не требует загрузки каких-либо сторонних инструментов.

Условия поиска могут быть организованы и расположены по-разному, если вы описываете, как это будет использоваться.

@echo off
type "database.txt" | findrepl "^.*<--(?=.*when)(?=.*india)(?=.*independence).*-->.*$" /o:0:1 /i
pause

При этом используется вспомогательный пакетный файл findrepl.bat (от aacini) — загрузите с: https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Поместите findrepl.bat в ту же папку, что и пакетный файл, или по пути.

person foxidrive    schedule 01.09.2014