0

たとえば、次のようなテキスト ファイルtest.txtがあります。

ええ

ええ

あああああ

あああああ

bbbb

546

iiiiii

フフフフ

qq

あああああ

qqq

あああああ

bbbb

123

iiiiii

フフフフ

太字でマークされた数字がIDと呼ばれると仮定すると、ID-123 の直前に現れる最初の aaaaa とID-123の後に現れる最初の fffffffの間のファイルの一部が必要です。

つまり、出力:

あああああ

bbbb

123

iiiiii

フフフフ

バッチを使用して実行できますか?

4

3 に答える 3

2

これを試してください、バッチソリューション:

@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
)
于 2013-07-12T23:02:43.930 に答える
1

編集:これらの追加要件を満たすために、以下のプログラムを変更しました。

1- パラメータに一致するすべてのセクションを空行で区切って抽出します。

2- 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
于 2013-07-13T02:10:50.230 に答える