私はテキストファイルを持っていますが、その一部だけを持ちたいと思っています。すべてがwordAとwordBの間に含まれています。
cmdバッチファイルを使用してそれは可能ですか?
私はテキストファイルを持っていますが、その一部だけを持ちたいと思っています。すべてがwordAとwordBの間に含まれています。
cmdバッチファイルを使用してそれは可能ですか?
これを行う1つの方法を次に示します。wordA と wordB が同じ行にあると仮定します (両方が存在する必要があります)。サブルーチン :FindString は、前にある不要なテキストを削除し、"wordB" を、テキスト内で想定されていない文字 (この場合は `) に置き換えて区切り文字として使用します。必要に応じて別の文字を使用してください。
@ECHO OFF
SET InFile=Test.txt
FOR /F "tokens=*" %%A IN ('FINDSTR "wordA" "%InFile%" ^| FINDSTR "wordB"') DO CALL :FindString "%%A"
pause
GOTO :eof
:FindString
SET String=%~1
SET String=%String:*wordA =%
SET String=%String: wordB=`%
FOR /F "tokens=1 delims=`" %%A IN ('ECHO.%String%') DO ECHO.%%A]
GOTO :eof
「wordA」と「wordB」が同じ行にない場合の方法を次に示します。出力を Output.txt に送信します。これは、入力ファイルの最初の「wordA」と最初の「wordB」の間のテキストになります (大文字と小文字が区別されます)。複数の (または不一致の) wordA/B のセットがある場合の対処方法を指定していません。
:RemoveWordB は、"wordB" を、区切り文字として使用するテキスト内で予期しない文字 (この場合は `) に置き換えます。必要に応じて別の文字を使用してください。
@ECHO OFF
SET InFile=Test.txt
SET OutFile=Output.txt
IF EXIST "%OutFile%" DEL "%OutFile%"
SET TempFile=Temp.txt
IF EXIST "%TempFile%" DEL "%TempFile%"
FOR /F "tokens=*" %%A IN ('FINDSTR /N "wordA" "%InFile%"') DO (
CALL :RemovePrecedingWordA "%%A"
FOR /F "tokens=1 delims=:" %%B IN ('ECHO.%%A') DO (
MORE +%%B "%InFile%"> "%TempFile%"
FINDSTR /V "wordB" "%TempFile%">> "%OutFile%"
FOR /F "tokens=*" %%C IN ('FINDSTR "wordB" "%InFile%"') DO (
CALL :RemoveWordB "%%C"
IF EXIST "%TempFile%" DEL "%TempFile%"
GOTO :eof
)
)
)
GOTO :eof
:RemovePrecedingWordA
SET String=%~1
SET String=%String:*wordA =%
ECHO.%String%> "%OutFile%"
GOTO :eof
:RemoveWordB
REM Replace "wordB" with a character that we don't expect in text that we will then use as a delimiter (` in this case)
SET LastLine=%~1
SET LastLine=%LastLine:wordB=`%
FOR /F "tokens=1 delims=`" %%A IN ('ECHO.%LastLine%') DO ECHO.%%A>> "%OutFile%"
GOTO :eof