HOWTO · Batch

Cómo reemplazar texto de un archivo en un script por lotes

Aprenda a reemplazar texto en un archivo desde Windows con un script por lotes, PowerShell o un puerto de sed instalado.

En esta página

Para reemplazar el texto coincidente en un archivo desde una línea de comandos de Windows, escriba el contenido transformado en un archivo separado e inspecciónelo antes de usarlo en lugar del original. Un script por lotes puede realizar sustituciones literales simples, PowerShell ofrece reemplazo basado en patrones y sed es una opción cuando hay instalado un puerto para Windows. Los ejemplos utilizan un archivo de texto pequeño y reemplazan sample por modified.

Reemplazar texto con un script por lotes de Windows

Este ejemplo por lotes crea su propia entrada temporal, procesa cada línea no vacía y escribe el resultado en un archivo de salida separado. Luego muestra la salida y elimina sus archivos temporales. La referencia existente en inglés del comando echo explica el comando utilizado para escribir cada línea. findstr puede ayudar a localizar líneas coincidentes antes o después de un cambio, pero busca; no reemplaza texto.

@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 ... lee líneas, la expansión retardada aplica una sustitución literal y redirigir el bucle escribe el resultado en un archivo diferente. Este patrón simple omite las líneas vacías y la expansión retardada puede alterar líneas que contengan !. Mantenga simples los valores de búsqueda y reemplazo porque la expansión por lotes tiene reglas para caracteres especiales; use PowerShell cuando importe la conservación exacta de las líneas o un texto más complejo.

Reemplazar texto con PowerShell

PowerShell está disponible en muchos sistemas Windows y es una buena opción cuando el archivo puede contener líneas vacías o caracteres que complican la expansión por lotes. Este ejemplo autónomo crea la entrada de ejemplo, reemplaza sample por modified, escribe UTF-8 sin marca de orden de bytes, muestra el resultado y elimina su directorio temporal.

$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

El operador -replace trata su primer operando como una expresión regular y la coincidencia no distingue mayúsculas de minúsculas de forma predeterminada. Para una cadena de búsqueda literal que contenga metacaracteres de expresiones regulares, escápela con [regex]::Escape($search); use -creplace cuando deba importar la distinción de mayúsculas. El escritor UTF-8 explícito evita depender de valores predeterminados específicos de la versión. Revise el archivo de salida antes de reemplazar el original.

Reemplazar texto con sed en Windows

sed no está incluido en todas las instalaciones de Windows. Úselo solo si hay un puerto para Windows instalado y disponible en PATH. Su forma de sustitución es s/search/replacement/g; para este ejemplo, ejecute sed "s/sample/modified/g" "input.txt" > "output.txt". La bandera g reemplaza cada coincidencia en cada línea, mientras que la redirección mantiene el original separado del resultado.

Los valores de búsqueda y reemplazo son interpretados por sed, por lo que caracteres como /, & y las barras invertidas pueden necesitar escape. Compruebe las reglas de comillas del puerto elegido cuando los valores contengan caracteres especiales de shell e inspeccione la salida antes de usarla como original.

Elegir un método y proteger el archivo de entrada

Para una sustitución corta y simple en la que las líneas vacías y los signos de exclamación no sean significativos, el bucle por lotes evita una dependencia adicional de scripting. PowerShell es una opción predeterminada práctica cuando es necesario controlar el texto literal, el comportamiento de las expresiones regulares o la codificación. Elija sed si ya hay disponible un puerto para Windows y su sintaxis de sustitución se ajusta a los datos.

Cada método debe escribir en una ruta de salida diferente para que la entrada permanezca intacta mientras se ejecuta la transformación. Compare la salida con el original y confirme la codificación esperada antes de reemplazar el original. Si el archivo contiene datos importantes, haga primero una copia de seguridad; redirigir la salida a la misma ruta que se está leyendo puede truncar la entrada antes de que termine el procesamiento.