Estoy escribiendo una secuencia de comandos de archivo por lotes utilizando el entorno de línea de comandos de Windows y quiero cambiar cada aparición de algún texto en un archivo (ej. "FOO") con otro (ej. "BAR"). ¿Cuál es la forma más sencilla de hacer eso? ¿Alguna función incorporada?
492
echo(%text:%search%=%replace%%)
Respuestas:
Muchas de las respuestas aquí me ayudaron a orientarme en la dirección correcta, sin embargo, ninguna fue adecuada para mí, por lo que estoy publicando mi solución.
Tengo Windows 7, que viene con PowerShell incorporado. Aquí está el script que usé para buscar / reemplazar todas las instancias de texto en un archivo:
Para explicarlo:
powershell
inicia powershell.exe, que se incluye 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 comentariosPowershell.exe ya debería ser parte de su declaración PATH, pero si no puede agregarla. La ubicación en mi máquina es
C:\WINDOWS\system32\WindowsPowerShell\v1.0
fuente
-encoding ASCII
o laUTF8
o lo que sea necesario. También tenga cuidado, si apunta a UTF8, puede introducir una marca de orden de bytes al comienzo del archivo que no apareció en el original.-encoding ASCII
. Para cualquiera que lo necesite en el futuro, seríaOut-File -encoding ASCII myFile.txt
Set-Content
lugar deOut-File
.Si está en la 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 incluidos. El siguiente ejemplo resolverá su pregunta. Estoy usando los nombres completos de los comandos, hay alias más cortos, pero esto te da algo para Google.
fuente
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Acabo de utilizar FART ( utilidad de línea de comandos " F ind A y R Eplace T ext"):
excelente software gratuito para la sustitución de texto dentro de un gran conjunto de archivos.
Los archivos de instalación están en SourceForge .
Ejemplo de uso:
previsualizará los reemplazos para hacer recursivamente en los archivos de esta distribución de Perl.
El único problema: el ícono del sitio web de FART no es exactamente de buen gusto, refinado o elegante;)
Actualización 2017 (7 años después) jagb señala en los comentarios al artículo de 2011 " FARTing the Easy Way - Find and Replace Text " de Mikail Tunç
fuente
/
y'
ya que esto no funciona para todos nosotros , para mí funcionó en algunos casos pero no funcionó en algunos archivos y no sé por qué. Utilicé esto para reemplazar el texto con otro texto y un/
Reemplazar - Reemplazar una subcadena con sustitución de cadena Descripción: Para reemplazar una subcadena con otra cadena, use la función de sustitución de cadena. El ejemplo que se muestra aquí reemplaza todas las ocurrencias de errores ortográficos "teh" con "the" en la variable de cadena str.
Salida de script:
ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
fuente
Crear archivo replace.vbs:
Para usar esta secuencia de comandos revisada (que llamaremos replace.vbs) simplemente escriba un comando similar a este desde el símbolo del sistema:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
fuente
RegExp
. Puede usar esta opción para sustituir el uso de una expresión regular:With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With
. Usted puede obtener el texto de los 9 primeros grupos de captura usando$1
,$2
...$9
.BatchSubstitute.bat
en dostips.com es un ejemplo de búsqueda y reemplazo utilizando un archivo por lotes puro.Se utiliza una combinación de
FOR
,FIND
yCALL SET
.Las líneas que contienen caracteres entre
"&<>]|^
pueden ser tratadas incorrectamente.fuente
Nota : asegúrese de ver la actualización al final de esta respuesta para obtener un enlace al JREPL.BAT superior que reemplaza a REPL.BAT
JREPL.BAT 7.0 y versiones superiores de forma nativa compatible con Unicode (UTF-16LE) a través de la
/UTF
opción, así como cualquier otro conjunto de caracteres, incluido UTF-8, a través de ADO !!!!He escrito una pequeña utilidad híbrida JScript / batch llamada REPL.BAT que es muy conveniente para modificar archivos ASCII (o ASCII extendido) a través de la línea de comando o un archivo por lotes. El script puramente nativo no requiere la instalación de ningún tercero ejecutable, y funciona en cualquier versión moderna de Windows desde XP en adelante. También es muy rápido, especialmente en comparación con las soluciones de lotes puros.
REPL.BAT simplemente lee stdin, realiza una búsqueda y reemplazo de expresiones regulares JScript y escribe el resultado en stdout.
Aquí hay un ejemplo trivial de cómo reemplazar foo con bar en test.txt, suponiendo que REPL.BAT está en su carpeta actual, o mejor aún, en algún lugar dentro de su RUTA:
Las capacidades de expresión regular de JScript lo hacen muy poderoso, especialmente la capacidad del texto de reemplazo para hacer referencia a subcadenas capturadas del texto de búsqueda.
He incluido una serie de opciones en la utilidad que la hacen bastante poderosa. Por ejemplo, la combinación de las opciones
M
yX
permite la modificación de archivos binarios. LaM
opción de varias líneas permite búsquedas en varias líneas. LaX
opción de patrón de sustitución extendido proporciona secuencias de escape que permiten la inclusión de cualquier valor binario en el texto de reemplazo.Toda la utilidad podría haberse escrito como JScript puro, pero el archivo por lotes híbrido elimina la necesidad de especificar explícitamente CSCRIPT cada vez que desee utilizar la utilidad.
Aquí está el script REPL.BAT. La documentación completa está incrustada en el script.
ACTUALIZACIÓN IMPORTANTE
He dejado de desarrollar REPL.BAT y lo he reemplazado con JREPL.BAT. Esta nueva utilidad tiene la misma funcionalidad de REPL.BAT, y mucho más:
Como siempre, la documentación completa está incrustada en el script.
La solución trivial original ahora es aún más simple:
La versión actual de JREPL.BAT está disponible en DosTips . Lea todas las publicaciones posteriores en el hilo para ver ejemplos de uso y un historial del desarrollo.
fuente
\q
representación"
, y los literales de búsqueda ahora admiten todas las secuencias de escape extendidas cuando se combinan las opciones L y X.Use FNR
Usa la
fnr
utilidad. Tiene algunas ventajas sobrefart
:Descargue FNR aquí: http://findandreplace.io/?z=codeplex
Ejemplo de uso:
fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"
fuente
No creo que haya una manera de hacerlo con ningún comando incorporado. Te sugiero que descargues algo como Gnuwin32 o UnxUtils y uses el
sed
comando (o solo descargarsed
):fuente
sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`
-i - edita el archivo in situ; -b - no procese CR + LF - sin esta opción CR + LF se convertiría a LFSé que llego tarde a la fiesta ...
Personalmente, me gusta la solución en: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
También, utilizamos ampliamente la función Dedupe para ayudarnos a entregar aproximadamente 500 correos electrónicos diariamente a través de SMTP desde: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
y ambos funcionan de forma nativa sin necesidad de herramientas o utilidades adicionales.
REEMPLAZO
DEDUPLICADOR (tenga en cuenta el uso de -9 para un número ABA):
¡Gracias!
fuente
Cuando trabaje con Git en Windows , simplemente inicie
git-bash
y usesed
. O, cuando use Windows 10, inicie "Bash en Ubuntu en Windows" (desde el subsistema Linux) y utilícelosed
.Es un editor de flujo, pero puede editar archivos directamente mediante el siguiente comando:
-i
La opción se utiliza para editar en el lugar en el nombre del archivo.-e
La opción indica un comando para ejecutar.s
se usa para reemplazar la expresión encontrada "foo" con "bar" yg
se usa para reemplazar las coincidencias encontradas.Nota de ereOn:
Si desea reemplazar una cadena en archivos versionados solo de un repositorio Git, puede usar:
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
que hace maravillas
fuente
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
que funciona de maravilla.Jugué con algunas de las respuestas existentes aquí y prefiero mi solución mejorada ...
o si desea guardar la salida nuevamente en un archivo ...
El beneficio de esto es que puede canalizar la salida de cualquier programa. También investigará el uso de expresiones regulares con esto. No se pudo encontrar la forma de convertirlo en un archivo BAT para un uso más fácil ... :-(
fuente
type
significa que todas las líneas de más de 80 caracteres quedan ajustadas. Que dolor.He usado perl, y eso funciona de maravilla.
.orig es la extensión que agregaría al archivo original
Para varios archivos que coinciden, como * .html
fuente
sed
conperl -pi.backup -e
y apreciar que :)Con el replacecer.bat
1) Con la
e?
opción que evaluará secuencias de caracteres especiales como\n\r
secuencias unicode. En este caso se sustituirá citado"Foo"
y"Bar"
:2) Sencillo sustitución donde el
Foo
yBar
no se citan.fuente
Aquí hay una solución que encontré que funcionó en Win XP. En mi archivo por lotes en ejecución, incluí lo siguiente:
El
replace.bat
archivo es el siguiente. No encontré una manera de incluir esa función dentro del mismo archivo por lotes, porque la%%a
variable siempre parece dar el último valor en el bucle for.replace.bat
:fuente
Eche un vistazo a ¿Hay alguna utilidad sed like para cmd.exe que solicitó un equivalente sed en Windows? También debería aplicarse a esta pregunta. Resumen Ejecutivo:
fuente
Puede llegar un poco tarde, pero con frecuencia estoy buscando cosas similares, ya que no quiero superar el dolor de obtener la aprobación del software.
Sin embargo, generalmente usa la declaración FOR en varias formas. Alguien creó un archivo por lotes útil que realiza una búsqueda y reemplazo. Echa un vistazo aquí . Es importante comprender las limitaciones del archivo por lotes proporcionado. Por esta razón, no copio el código fuente en esta respuesta.
fuente
search and replace
Los miembros de Stack Overflow han escrito dos archivos por lotes que proporcionan funcionesdbenham
yaacini
utilizannative built-in jscript
en Windows.Ambos son
robust
y severy swift with large files
comparan con las secuencias de comandos por lotes simples, y tambiénsimpler
para usar para el reemplazo básico de texto. Ambos tienenWindows regular expression
coincidencia de patrones.Este
sed-like
archivo por lotes auxiliar se llamarepl.bat
(por dbenham).Ejemplo usando el
L
interruptor literal:Este
grep-like
archivo por lotes auxiliar se llamafindrepl.bat
(por aacini).Ejemplo que tiene expresiones regulares activas:
Ambos se convierten en poderosas utilidades de todo el sistema
when placed in a folder that is on the path
, o se pueden usar en la misma carpeta con un archivo por lotes, o desde el indicador de cmd.Ambos tienen
case-insensitive
interruptores y también muchas otras funciones.fuente
El comando Power Shell funciona de maravilla
fuente
Acabo de enfrentar un problema similar: "Buscar y reemplazar texto dentro de archivos", pero con la excepción de que tanto para los nombres de archivo como para buscar / reparar necesito usar expresiones regulares. Debido a que no estoy familiarizado con Powershell y quiero guardar mis búsquedas para un uso posterior, necesito algo más "fácil de usar" (preferible si tiene GUI).
Entonces, mientras buscaba en Google :) encontré una gran herramienta: FAR (Buscar y reemplazar) (no FART).
Ese pequeño programa tiene una GUI agradable y admite expresiones regulares para buscar en nombres de archivo y dentro de archivos. La única desventaja es que si desea guardar su configuración, debe ejecutar el programa como administrador (al menos en Win7).
fuente
Estoy prefiero uso
sed
de utilidades GNU para Win32 , las siguientes deben ser observadoEntonces, el código de trabajo
sed
para encontrar y reemplazar texto en un archivo en Windows es el siguientefuente
-i
! Si su versión sed lo hace, verifique el comando de esta respuesta: stackoverflow.com/a/33762001/2492801 .Esta es una cosa que las secuencias de comandos por lotes simplemente no funcionan bien.
El guión morechilli vinculado a funcionará para algunos archivos, pero desafortunadamente se ahogará con los que contienen caracteres como tuberías y símbolos de unión.
VBScript es una mejor herramienta integrada para esta tarea. Consulte este artículo para ver un ejemplo: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
fuente
@Rachel dio una excelente respuesta, pero aquí hay una variación para leer contenido en una
$data
variable de PowerShell . Luego, puede manipular fácilmente el contenido varias veces antes de escribir en un archivo de salida. También vea cómo se proporcionan valores de varias líneas en un archivo por lotes .bat.fuente
Use powershell en .bat - para Windows 7+
codificar utf8 es opcional, bueno para sitios web
fuente
Descargar Cygwin (gratis) y use comandos similares a Unix en la línea de comandos de Windows.
Tu mejor apuesta: sed
fuente
También puede ver las herramientas Reemplazar y Reemplazar filtro en https://zoomicon.github.io/tranXform/ (fuente incluida). El segundo es un filtro.
La herramienta que reemplaza las cadenas en los archivos está en VBScript (necesita Windows Script Host [WSH] para ejecutarse en versiones antiguas de Windows)
El filtro probablemente no funciona con Unicode a menos que recompile con el último Delphi (o con FreePascal / Lazarus)
fuente
Me he enfrentado a este problema varias veces mientras codificaba bajo Visual C ++. Si lo tiene, puede usar la utilidad de búsqueda y reemplazo de Visual Studio. Le permite seleccionar una carpeta y reemplazar el contenido de cualquier archivo en esa carpeta con cualquier otro texto que desee.
En Visual Studio: Editar -> Buscar y reemplazar En el cuadro de diálogo abierto, seleccione su carpeta y complete los cuadros "Buscar qué" y "Reemplazar con". Esperamos que esto sea útil.
fuente