如何将包含特定字符串的行的行号存储在环境变量中的文本文件中?

How to store the line numbers of the lines containing a specific string in a text file in an environment variable?

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

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

我需要另一段代码将文本所在的行号输出到变量。

如何在环境变量中存储文本文件中包含特定字符串的行的行号?

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

使用以下批处理文件。

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

进一步阅读

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

@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 在这种情况下首先输出文件名,然后是冒号,然后是行号,然后是一个更多的冒号,而不是像在单个文件上搜索时那样只有行号和冒号。

运行 在命令提示符中至少一次 window 例如

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

将上面的批处理代码保存在当前目录下的文件SearchString.bat中,查看这里处理的是什么命令FOR

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

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

另请阅读有关 Using command redirection operators 的 Microsoft 文章,了解 2>nul 的解释,以将 FINDSTR 输出的错误消息重定向到处理 如果在搜索文件中找不到搜索到的字符串,STDERR 到设备 NUL 以抑制它。重定向运算符 > 必须在此处使用 ^ 进行转义,以在执行 FINDSTR 时应用重定向,而不是将 2>nul 解释为命令 [= 的重定向44=]FOR 在命令行中的无效位置。