텍스트 파일에서 문자열을 읽고 Windows 배치 파일에서 사용하여 하위 문자열을 추출하는 방법
Aug 20 2020
다음 샘플을 포함하는 텍스트 파일이 있습니다. 하나의 상수 문자열 "D80"다음에 다른 문자열 :
D80KAAAAAA
D80KBBBBBB
D80KCCCCCC
이 출력을 얻기 위해 Windows 배치 스크립트 파일 (Powershell 아님) 및 FOR 루프를 사용하여 추출하려고합니다.
AAAAAA
BBBBBB
CCCCCC
지금까지 우리는이 지점에 도달했습니다. 설명을 위해 부분 문자열을 추출하는 여러 시도를 보여주었습니다.
setlocal EnableDelayedExpansion
for /F "tokens=1 delims=" %%a in (TPLIST.txt) do (
echo %%a
echo %%(a:~4,6)
set substr1=%%(a:~4,6)%
set substr2=%(a:~4,6)%
set substr3=!(a:~4,6)!
set substr4=%!(a:~4,6)!%
echo %substr1%
echo %substr2%
echo %substr3%
echo %substr4%
)
그러나 하위 문자열 추출은 실패합니다.
C:\User>setlocal EnableDelayedExpansion
C:\User>for /F "tokens=1 delims=" %a in (TPLIST.txt) do (
echo %a
echo %(a:~4,6
)
C:\User>(
echo D80KAAAAAA
echo %(a:~4,6
)
D80KAAAAAA
%(a:~4,6
C:\User>(
echo D80KBBBBBB
echo %(a:~4,6
)
D80KBBBBBB
%(a:~4,6
C:\User>(
echo D80KCCCCCC
echo %(a:~4,6
)
D80KCCCCCC
%(a:~4,6
C:\User>set substr1=%(a:~4,6)
C:\User>set substr2=~4,6)
C:\User>set substr3=!(a:~4,6)!
C:\User>set substr4=~4,6)!
C:\User>echo %(a:~4,6)
%(a:~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)
C:\User>echo ~4,6)
~4,6)
어떤 도움이라도 대단히 감사하겠습니다.
답변
1 DavidPostill Aug 20 2020 at 04:36
하위 문자열을 어떻게 추출합니까?
귀하의 스크립트가 끔찍하게 손상되어 다시 작성했습니다.
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3" %%a in (test.txt) do (
set _s1=%%a
set _s2=%%b
set _s3=%%c
echo !_s1:~4!
echo !_s2:~4!
echo !_s3:~4!
)
endlocal
사용 예 :
F:\test>type test.txt
D80KAAAAAA D80KBBBBBB D80KCCCCCC
F:\test>test
AAAAAA
BBBBBB
CCCCCC
F:\test>
추가 읽기
- Windows CMD 명령 줄의 AZ 인덱스 | SS64.com
- Windows CMD 명령 (분류)-Windows CMD-SS64.com
- / f-텍스트 반복-Windows CMD-SS64.com
- 가변 하위 문자열-Windows CMD-SS64.com
1 Hackoo Aug 26 2020 at 05:44
Pure 배치 파일에서 다음과 같이 할 수 있습니다.
@echo off
Set "InputFile=TPLIST.txt"
Set "OutPutFile=%~dp0Out-Extract.txt"
setlocal enabledelayedexpansion
> "%OutPutFile%" (
@for /f "delims=" %%a in ('Type "%InputFile%"') do (
set "_MyString=%%a"
echo !_MyString:~4!
)
)
endlocal
If Exist "%OutPutFile%" Start "" "%OutPutFile%"
다른 구성원이 RegEx를 사용하여 테스트하려는 경우 Powershell에서 :
cls
$MyString = @' D80KAAAAAA D80KBBBBBB D80KCCCCCC D80KDDDDDD D80KEEEEEE D80KFFFFFF D80KXXXXXX D80KYYYYYY D80KZZZZZZ '@ -split [System.Environment]::NewLine $pattern = '(?![D80K]).+'
$MyString | %{ [regex]::matches($_,$pattern) } | %{ $_.Groups[0].Value }
다음과 같은 솔루션 배치 또는 powershell에 대한 출력으로 표시됩니다.
AAAAAA BBBBBB CCCCCC DDDDDD EEEEEE FFFFFF XXXXXX YYYYYY ZZZZZZ