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

时间:2016-08-28 15:53:20

标签: string windows batch-file findstr line-numbers

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

@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文章Using command redirection operators,了解2>nul重定向错误消息输出 FINDSTR 以处理 STDERR 到设备如果在搜索文件中找不到搜索到的字符串,则 NUL 来禁止它。必须使用>对重定向运算符^进行转义,以便在执行 FINDSTR 时应用重定向,而不是将2>nul解释为命令 FOR <的重定向/ strong>在命令行中的无效位置。

答案 1 :(得分:1)

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

使用以下批处理文件。

<强> 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

进一步阅读