¿Cómo se puede buscar y reemplazar texto en un archivo usando el entorno de línea de comandos de Windows?
Estoy escribiendo un script de archivo por lotes usando el entorno de línea de comandos de Windows y quiero cambiar cada aparición de algún texto en un archivo (por ejemplo, "FOO") por otro (por ejemplo, "BAR"). ¿Cuál es la forma más sencilla de hacerlo? ¿Alguna función integrada?
Muchas de las respuestas aquí me ayudaron a orientarme en la dirección correcta, sin embargo, ninguna era adecuada para mí, así que publico mi solución.
Tengo Windows 7, que viene con PowerShell integrado. Aquí está el script que utilicé para buscar/reemplazar todas las instancias de texto en un archivo:
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"
Para explicarlo:
powershell
inicia powershell.exe, que está incluido en Windows 7-Command "... "
es un argumento de línea de comando para powershell.exe que contiene el comando para ejecutar(gc myFile.txt)
lee el contenido demyFile.txt
(gc
es la abreviatura delGet-Content
comando)-replace 'foo', 'bar'
simplemente ejecuta el comando reemplazar para reemplazarfoo
conbar
| Out-File myFile.txt
canaliza la salida al archivomyFile.txt
-encoding ASCII
evita la transcripción del archivo de salida a Unicode, como señalan los comentarios
Powershell.exe ya debería ser parte de su declaración PATH, pero si no, puede agregarlo. La ubicación en mi máquina esC:\WINDOWS\system32\WindowsPowerShell\v1.0
Actualización
Aparentemente, los sistemas Windows modernos tienen PowerShell integrado, lo que le permite acceder directamente usando
(Get-Content myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt
Si tiene una versión de Windows que admite .Net 2.0, reemplazaría su shell. PowerShell le brinda todo el poder de .Net desde la línea de comandos. También hay muchos comandos integrados. El siguiente ejemplo resolverá su pregunta. Estoy usando los nombres completos de los comandos, hay alias más cortos, pero esto le da algo a Google.
(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
Acabo de usar FART (utilidad de línea de comando " Buscar y reemplazar texto " ) : excelente pequeño software gratuito para reemplazar
texto dentro de un gran conjunto de archivos.
Los archivos de instalación están en SourceForge .
Ejemplo de uso:
fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools
Previsualizará los reemplazos a realizar de forma recursiva en los archivos de esta distribución de Perl.
El único problema: el icono del sitio web de FART no es precisamente de buen gusto, refinado o elegante;)
Actualización de 2017 (7 años después), señala jagb en los comentarios al artículo de 2011 " FARTing the Easy Way – Find And Replace Text " de Mikail Tunç
Como señaló Joe Jobs en los comentarios (diciembre de 2020), si desea reemplazar, &A
por ejemplo, deberá usar comillas para asegurarse de que &
el shell no lo interprete:
fart in.txt "&A" "B"