HOWTO · Batch

배치 스크립트에서 파일의 텍스트를 바꾸는 방법

배치 스크립트, PowerShell 또는 설치된 sed 포트를 사용해 Windows에서 파일의 텍스트를 바꾸는 방법을 알아보세요.

이 페이지의 내용

Windows 명령줄에서 파일의 일치하는 텍스트를 바꾸려면 변환된 내용을 별도의 파일에 쓰고 원본 대신 사용하기 전에 검사하세요. 배치 스크립트는 단순한 리터럴 치환을 수행할 수 있고, PowerShell은 패턴 기반 바꾸기를 제공하며, sed는 Windows 포트가 설치되어 있을 때 선택할 수 있습니다. 예제에서는 작은 텍스트 파일을 사용하고 sample을 modified로 바꿉니다.

Windows 배치 스크립트로 텍스트 바꾸기

이 배치 예제는 자체 임시 입력을 만들고, 비어 있지 않은 각 줄을 처리한 뒤, 결과를 별도의 출력 파일에 씁니다. 그런 다음 출력을 표시하고 임시 파일을 제거합니다. 기존 영어 echo 명령 참고 자료는 각 줄을 쓰는 데 사용되는 명령을 설명합니다. findstr은 변경 전후에 일치하는 줄을 찾는 데 도움이 될 수 있지만, 검색만 할 뿐 텍스트를 바꾸지는 않습니다.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "work=%TEMP%\batch-replace-%RANDOM%"
md "%work%"
set "inputFile=%work%\input.txt"
set "outputFile=%work%\output.txt"
> "%inputFile%" echo sample text, ready
>> "%inputFile%" echo keep this line
set "search=sample"
set "replace=modified"
(for /f "usebackq delims=" %%L in ("%inputFile%") do (
    set "line=%%L"
    set "line=!line:%search%=%replace%!"
    echo !line!
)) > "%outputFile%"
type "%outputFile%"
del "%inputFile%" "%outputFile%"
rmdir "%work%"
endlocal

for /f "usebackq delims=" %%L in ("%inputFile%") do ...는 줄을 읽고, 지연 확장은 리터럴 치환을 적용하며, 루프를 리디렉션하면 결과가 다른 파일에 쓰입니다. 이 단순한 패턴은 빈 줄을 건너뛰고, 지연 확장은 !가 포함된 줄을 변경할 수 있습니다. 배치 확장에는 특수 문자 규칙이 있으므로 검색 값과 바꾸기 값은 단순하게 유지하세요. 줄을 정확히 보존하거나 더 복잡한 텍스트가 중요한 경우에는 PowerShell을 사용하세요.

PowerShell로 텍스트 바꾸기

PowerShell은 많은 Windows 시스템에서 사용할 수 있으며 파일에 빈 줄이나 배치 확장을 복잡하게 만드는 문자가 포함될 수 있을 때 적합합니다. 이 독립 실행형 예제는 샘플 입력을 만들고, sample을 modified로 바꾸고, 바이트 순서 표시가 없는 UTF-8로 쓰고, 결과를 표시한 뒤, 임시 디렉터리를 제거합니다.

$work = Join-Path ([IO.Path]::GetTempPath()) ([guid]::NewGuid().ToString())
New-Item -ItemType Directory -Path $work | Out-Null
$inputFile = Join-Path $work 'input.txt'
$outputFile = Join-Path $work 'output.txt'
[IO.File]::WriteAllText($inputFile, "sample text, ready`nkeep this line`n")
$text = [IO.File]::ReadAllText($inputFile)
$result = $text -replace 'sample', 'modified'
$utf8 = New-Object System.Text.UTF8Encoding -ArgumentList $false
[IO.File]::WriteAllText($outputFile, $result, $utf8)
Get-Content -LiteralPath $outputFile
Remove-Item -LiteralPath $work -Recurse -Force
modified text, ready
keep this line

-replace 연산자는 첫 번째 피연산자를 정규식으로 취급하며, 일치는 기본적으로 대소문자를 구분하지 않습니다. 정규식 메타문자가 포함된 리터럴 검색 문자열은 [regex]::Escape($search)로 이스케이프하세요. 대소문자가 중요해야 하는 경우에는 -creplace를 사용하세요. 명시적인 UTF-8 작성기는 버전별 기본값에 의존하지 않도록 합니다. 원본을 바꾸기 전에 출력 파일을 검토하세요.

Windows에서 sed로 텍스트 바꾸기

sed는 모든 Windows 설치에 포함되어 있지 않습니다. Windows 포트가 설치되어 있고 PATH에서 사용할 수 있을 때만 사용하세요. 치환 형식은 s/search/replacement/g입니다. 이 예제에서는 sed "s/sample/modified/g" "input.txt" > "output.txt"를 실행합니다. g 플래그는 각 줄의 모든 일치를 바꾸며, 리디렉션은 원본과 결과를 분리된 상태로 유지합니다.

검색 값과 바꾸기 값은 sed에 의해 해석되므로 /, &, 백슬래시와 같은 문자는 이스케이프해야 할 수 있습니다. 값에 셸 특수 문자가 포함되어 있을 때는 선택한 포트의 인용 규칙을 확인하고, 출력을 원본으로 사용하기 전에 검사하세요.

방법 선택 및 입력 파일 보호

빈 줄과 느낌표가 중요하지 않은 짧고 단순한 치환에서는 배치 루프가 추가 스크립팅 종속성을 피할 수 있습니다. 리터럴 텍스트, 정규식 동작 또는 인코딩을 제어해야 할 때는 PowerShell이 실용적인 기본 선택입니다. Windows 포트를 이미 사용할 수 있고 그 치환 구문이 데이터에 맞는다면 sed를 선택하세요.

각 방법은 변환이 실행되는 동안 입력이 그대로 유지되도록 다른 출력 경로에 써야 합니다. 출력과 원본을 비교하고 예상 인코딩을 확인한 뒤 원본을 바꾸세요. 파일에 중요한 데이터가 들어 있다면 먼저 백업을 만드세요. 읽고 있는 것과 같은 경로로 출력을 리디렉션하면 처리가 끝나기 전에 입력이 잘릴 수 있습니다.