레이블이 Batch인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Batch인 게시물을 표시합니다. 모든 게시물 표시

2017년 12월 8일 금요일

배치 파일 팁 - 라인스트링에서 단어단위로 작업하기

라인 스트링에서 개별단어를 뽑아내려면 어떻게 해야할까요?

가령 다음과 같은 스트링에서 
각 단어별로 처리를 하고 싶다면 어떻게 해야할까요
배치파일 내에서는 아래와 같은 방식으로 위의 스트링을 입력할 것입니다.

많은 사람들은 for 명령어에 여러가지 옵션을 붙여서 이 문제를 해결하려고 노력할 것입니다.
그러나 결론부터 말하면 for 명령어는 스트링을 개별적으로 처리하는 능력이 없다고 합니다.
그런 결론의 출처를 언급하고 싶지만 저도 귀찮이즘이라서... 양해를 부탁드립니다.

그러면 어떻게 하면 단어 단위로 작업을 할 수 있을까요?

웹서핑중에 아이디어를 얻었습니다.
그 아이디어는 "tokens=1*" 옵션으로 for 명령을 실행하여 첫번째 문장은 %%a에 저장하고 나머지는 %%b에 저장하는것입니다.
이렇게 한뒤 LINE_STRING을 %%b로 설정하고 필요한 만큼 반복실행하는것입니다.

"tokens=1*" 옵션으로 for를 실행했을때의 결과를 보면 다음과 같습니다.
아래의 배치파일을 실행하면
아래의 결과를 얻게됩니다.
 앞에서 설명한대로 LINE_STRING을 %%b로 대입하고 반복실행하면
아래와 같은 결과를 얻게됩니다.

이 방식을 발전시켜서 if 제어문을 사용하고 문자열 길이만큼 반복실행해서 단어를 분해해 내는것입니다.
아래처럼 배치파일을 작성하면
그 결과로 아래를 얻습니다.
예제를 포함한 전체 배치파일 소스는 아래와 같습니다.

@echo off

echo -- Example 1 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
)
echo ------------------------

echo -- Example 2 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo ------------------------


echo -- Example 3 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
:L1
if "%LINE_STRING%" neq "" (
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo.  word : [%%a]
set "LINE_STRING=%%b"
)
goto :L1
)
echo ------------------------


2017년 11월 23일 목요일

배치 파일 팁 - 빈 라인(Empty Line)을 포함하여 텍스트 파일 스캔하기

배치파일 안에서 다른 텍스트 파일의 내용을 열람할 수 있습니다.
텍스트 파일의 내용을 열람하려면 아래와 같이 합니다.

for /f "delims=" %%a in (test.txt) do echo.%%a

이렇게 하면 텍스트 파일내의 라인을 출력해줍니다.
예를들어 입력 테스트 파일이 아래와 같다고 하면


아래와 같이 출력됩니다.

이것의 문제는 입력 텍스트의 빈 줄(Empty Line)이 없어졌다는 거죠
그것 자체를 의도했을 수도 있지만 빈 줄 자체를 그대로 처리해야할 때도 있습니다.
이것을 위해서 위의 배치파일을 아래와 같이 수정합니다.

for /f "delims=" %%a in ('type test.txt') do echo.%%a

이것은 괄호안의 명령이 바뀌었습니다.
작은 따옴표를 사용해서 명령어를 만들고 그 실행결과를 줄단위로 파싱합니다.
이것의 결과는 앞에서와 같습니다.

for 명령어는 이처럼 명령어의 실행결과로 리턴되는 출력값을 줄단위로 처리할 수 있습니다.
자세한것은 for의 도움말을 참고하십시요.

for는 본질적으로 "빈 줄"을 처리할 수 없습니다. 그래서 빈 줄을 빈줄이 아닌것으로 가공합니다.
여러가지 도구를 사용할 수 있겠지만 여기서는 find 명령어를 사용합니다.
find 명령어를 사용해서 다음과 같이 입력하면 아래와 같이 결과가 나옵니다.

find /n /v "" test.txt

실행결과는 아래와 같습니다.

공백라인 앞에 [숫자]가 붙어서 확장되었습니다.
그런데 맨 위줄에 "---------- TEST.TXT"이 붙어 있습니다.
이것을 그대로 for문에 입력해 봅니다.

for /f "delims=" %%a in ('find /n /v "" test.txt') do echo.%%a

이것의 실행결과는 아래와 같이 됩니다.

역시 맨위줄에 "---------- TEST.TXT"이 나타나게 됩니다.
맨 위줄에 나오는 "---------- TEST.TXT"를 제거해야 합니다.
방법은 find 명령어에 직접 파일을 지정하지않고 파이프로 사용하는것입니다.
우선 type 명령어로 파일내용을 열람하고 그것을 파이프를 통해서 find에 전달합니다.

for /f "delims=" %%a in ('type test.txt ^| find /n /v ""') do echo.%%a

이것의 실행결과는 아래와 같습니다.