说,我有一个文本文件test.txt如下:
ee
eee
啊啊啊
啊啊啊
bbbb
546
iiiiii
呸呸呸
啊啊啊
啊啊啊
bbbb
123
iiiiii
呸呸呸
假设标记为粗体的数字称为ID,那么我需要在 ID-123 之前出现的第一个 aaaaa 和出现在ID-123之后的第一个 fffffff之间的文件的一部分
即输出:
啊啊啊
bbbb
123
iiiiii
呸呸呸
可以使用批处理完成吗?
说,我有一个文本文件test.txt如下:
ee
eee
啊啊啊
啊啊啊
bbbb
546
iiiiii
呸呸呸
啊啊啊
啊啊啊
bbbb
123
iiiiii
呸呸呸
假设标记为粗体的数字称为ID,那么我需要在 ID-123 之前出现的第一个 aaaaa 和出现在ID-123之后的第一个 fffffff之间的文件的一部分
即输出:
啊啊啊
bbbb
123
iiiiii
呸呸呸
可以使用批处理完成吗?
试试这个,批处理解决方案:
@echo off &SETLOCAL
FOR /f "delims=:" %%a IN ('findstr /n "123" "test.txt"') DO SET /a match=%%a
SET /a first=match-2
SET /a last=match+2
FOR /f "tokens=1*delims=:" %%a IN ('findstr /n "^" "test.txt"') DO (
IF %%a geq %first% IF %%a leq %last% ECHO %%b
)
您可以使用grep for Windows 执行此操作:
grep -A2 -B2 "123" test.txt
编辑:我修改了以下程序以满足这些附加要求:
1-提取与参数匹配的所有部分,用空行分隔。
2- 将结果存储在由第二个参数和 .txt 扩展名给出的文件中
@echo off
setlocal EnableDelayedExpansion
if "%~3" equ "" (
echo FindSection.bat sectionStart middleKeyword sectionEnd
goto :EOF
)
set lastStart=
set start=
set i=0
for /F "tokens=1* delims=:" %%a in ('findstr /N "%~1 %~2 %~3" test.txt') do (
if "%%b" equ "%~1" (
set lastStart=%%a
) else if "%%b" equ "%~2" (
set start=!lastStart!
) else if "%%b" equ "%~3" (
if defined start (
set /A i+=1
set /A start[!i!]=start, end[!i!]=%%a
set lastStart=
set start=
)
)
)
if %i% equ 0 (
echo Section not found
goto :EOF
)
set /A i+=1
set /A start[%i%]=0x7FFFFFFF, end[%i%]=0x7FFFFFFF
set /A i=1, start=start[1], end=end[1]
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" test.txt') do (
if %%a gtr !end! (
set /A i+=1
set /A start=start[!i!], end=end[!i!]
)
if !start! leq %%a if %%a leq !end! echo(%%b
if %%a equ !end! echo/
)) > "%~2.txt"
例如:
C:> FindSection aaaaa 123 fffffff
C:> type 123.txt
aaaaa
bbbb
123
iiiii
fffffff