正确的解决方案是找到一个可以正确执行此操作的工具。批处理/CMD 没有。
这是一个脚本,它告诉您第 3 和第 4 匹配的行号。这可能不是您想要的,但它展示了如何有效地使用行号。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET FILE=TestFile.txt
SET _LINENO=1
SET _MATCHNO=0
SET _THIRDLINENUM=
SET _FOURTHLINENUM=
FOR /F %%l IN (%FILE%) DO (
ECHO %%l | FINDSTR "Target" %_TMP% >NUL
IF NOT ERRORLEVEL 1 (
SET /A _MATCHNO=!_MATCHNO!+1
IF !_MATCHNO!==3 SET _THIRDLINENUM=!_LINENO!
IF !_MATCHNO!==4 SET _FOURTHLINENUM=!_LINENO!
)
SET /A _LINENO=!_LINENO!+1
)
@ECHO %_THIRDLINENUM% : %_FOURTHLINENUM%
这是 TestFile.txt 中的内容
abcdefg
bcdefgh
Target 1
cdefghi
defghij
fghijkl
Target 2
ghijklm
hijklmn
ijklmno
jklmnop
klmnopq
lmnopqr
mnopqrs
Target 3
nopqrst
Target 4
opqrstu
pqrstuv
qrstuvw
rstuvwx
stuvwxy
tuvwxyz
如果您坚持使用批处理/CMD(有时在没有其他可用的情况下我会这样做),并且您需要在第 #n 行获取文本(否则,head 和 tail 就可以了),您可以产生类似的循环但是将 FINDSTR 中的代码替换为 IF 语句末尾的代码,将 _LINENO 与其他变量进行比较,如果它在两个值之间,则 ECHO 行。我不知道 IF 是否支持逻辑运算符,因此您可能必须嵌套 IF 语句,例如
IF !_LINENO! GEQ %START_LINE% IF !_LINENO! LEQ %END_LINE% @ECHO %%l