如何在文件中搜索字符串并将找到的行和下一行复制到另一个文件?

时间:2014-08-27 14:22:31

标签: batch-file cmd findstr

我在名为database.txt的文件中有2行。一行包含一个问题,下面的连续行包含答案。

例如:

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

如果用户搜索时,印度,独立?,则第一行会被复制到另一个名为result.txt的文件中。但我想要复制,问答两行。

有人可以在这里发光吗?

2 个答案:

答案 0 :(得分:3)

在发布问题之前,应始终先阅读帮助主题What topics can I ask about here?。 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
)

答案 1 :(得分:0)

下面使用的帮助程序批处理文件采用本机批处理技术,不需要任何下载的第三方工具。

如果您描述如何使用搜索字词,可以通过各种方式对搜索字词进行组织和排列。

@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放在与批处理文件相同的文件夹中或路径上。