如何将包含特定string的行的行号存储在环境variables的文本文件中?

我目前有这个批处理代码告诉我这个string出现在文本文件中的次数。

@ECHO OFF set /a Numb=0 for /f %%i in ('FINDSTR /N .* %1') do (set /a Numb+=1) echo %Numb% 

我需要另一段代码来输出文本所在的行号给一个variables。

如何将包含特定string的行的行号存储在环境variables的文本文件中?

我的这个任务的批处理代码,需要指定文件名和搜索字符串作为运行批处理文件的参数,并进行一些错误检查:

 @echo off setlocal EnableDelayedExpansion set "FileName=%~1" set "Search=%~2" rem Exit batch file if the two required arguments were not specified. if "%FileName%" == "" ( echo Error: There is no file name specified as first parameter. goto ErrorOuput ) if "%Search%" == "" ( echo Error: There is no search string specified as second parameter. goto ErrorOuput ) if not exist "%FileName%" ( echo Error: The file "!FileName!" does not exist. goto ErrorOuput ) set "LineNumbers=" for /F "delims=:" %%I in ('%SystemRoot%\System32\findstr.exe /I /L /N /C:"%Search%" "%FileName%" 2^>nul') do set "LineNumbers=!LineNumbers!,%%I" if "%LineNumbers%" == "" ( echo Info: The string "!Search!" could not be found in "!FileName!" goto EndBatch ) rem Remove the comma from begin of list of line numbers. set "LineNumbers=!LineNumbers:~1!" echo Found "!Search!" in "!FileName!" on the lines: echo. echo %LineNumbers% goto EndBatch :ErrorOuput echo. echo Usage: %~nx0 "file name" "search string" :EndBatch echo. endlocal pause 

错误检查不完整。 仍然可能发生错误。 例如,第一个参数可能是*.txt ,这会产生一个错误的结果,因为在这种情况下, FINDSTR首先输出文件名,然后是冒号,然后是行号,多一个冒号,而不是像行号和冒号一样搜索在一个文件上。

例如,在命令提示符窗口中至少运行一次

 findstr /I /L /N /C:"endbatch" "SearchString.bat" 

将上面的批处理代码存储在当前目录下的SearchString.bat文件中,以查看这里的FOR进程。

为了理解使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • call /? …解释%~1%~2
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关使用命令重定向操作符来解释2>nul以重定向由FINDSTR输出的错误消息的文章,以便将STDERR处理为设备NUL,以便在搜索文件中找不到搜索到的字符串时将其抑制。 重定向操作符>必须在这里用^转义,以便在执行FINDSTR时应用重定向,而不是在命令行的无效位置将2>nul解释为命令FOR的重定向。

如何在文本文件中存储字符串匹配行的行号?

使用下面的批处理文件。

TEST.CMD:

 @echo off setlocal enabledelayedexpansion set line_numbers= for /f "skip=2 delims=[]" %%i in ('find /n /i "%1" names.txt') do ( set line_numbers=!line_numbers! %%i ) rem skip leading space echo %line_numbers:~1% endlocal 

笔记:

  • 将搜索字符串作为参数传递给test.cmd
  • 正在搜索的文件是names.txt (您也可以将其作为参数传递)。
  • 匹配行号被添加到变量line_numbers

用法示例:

 F:\test>type names.txt Joe Bloggs, 123 Main St, Dunoon Arnold Jones, 127 Scotland Street, Edinburgh Joe Bloggs, 123 Main St, Dunoon Arnold Jones, 127 Scotland Street, Edinburgh Joe Bloggs, 123 Main St, Dunoon Arnold Jones, 127 Scotland Street, Edinburgh F:\test>test bloggs 1 3 5 F:\test>test jones 2 4 6 

进一步阅读

  • Windows CMD命令行的AZ索引 – 与Windows cmd行有关的所有东西的极好参考。
  • find – 在文件中搜索文本字符串并显示找到的所有行。
  • for / f – 循环命令针对另一个命令的结果。
  • 变量 – 提取变量的一部分(子字符串)。