miércoles, 26 de junio de 2013

Buscar y reemplazar texto en varios archivos en sólo 7 líneas

¿Alguna vez se necesita para realizar la búsqueda / sustitución de operaciones de varios archivos en una carpeta y todas sus subcarpetas? ¿Alguna vez se necesita para buscar / reemplazar texto en una lista de archivos? ¿Qué tal la realización de múltiples de la búsqueda / reemplaza las operaciones en un único archivo de base de buscar / reemplazar pares especificados en un archivo de texto? En este artículo se muestra cómo hacer cada una de estas búsqueda común / reemplazo mediante TEXTools - y créanlo o no - en sólo 7 líneas de código de lote!

Para llevar a cabo cada una de estas tareas, vamos a estar utilizando TEXTools (TCL.exe) a partir de un archivo por lotes. TEXTools es el complemento perfecto para la programación archivo por lotes, ya que amplía en gran medida el poder de los archivos por lotes. Sin la aplicación de un solo bucle for, un TEXTools dotados archivo por lotes puede procesar obstante fácilmente múltiples archivos. Esto es posible porque los archivos de proceso por lotes se pueden construir en la marcha por otro archivo por lotes y luego llama a ese archivo por lotes, (la clase como un tren que construye su camino a medida que avanza). La razón de que un bucle no es necesaria para procesar múltiples archivos es simplemente porque TEXTools pueden tomar una lista de archivos que se deben procesar y traducir esa lista en un archivo por lotes que, cuando es ejecutado, los resultados en el tratamiento de cada uno de los archivos. Por ejemplo, supongamos que deseamos llevar a cabo algunas operaciones de edición de texto relativamente complejas en la siguiente lista de los archivos:

miarchivo.txt

yourfile.txt

theirfile.txt

...

Una forma de hacerlo sería colocar la lógica de edición en un archivo por lotes denominado procfile.bat y luego procesar cada archivo - una tras otra - con procfile.bat así:

miarchivo.txt procfile.bat

yourfile.txt procfile.bat

theirfile.txt procfile.bat

...

Eso es genial si sólo tiene 3 archivos, pero lo que si tiene 100 o incluso 1.000 archivos a procesar? Ahí es donde TEXTools entra en escena. Si los archivos de proceso por lotes son sólo texto y que se pueden construir en la marcha, entonces por qué no utilizar TEXTools dirigir nuestra lista de nombres de archivo en un archivo por lotes que, cuando se ejecuta, los resultados en el tratamiento de cada uno de los archivos? Si un archivo por lotes como procfile.bat se va a emplear en el proceso de todos modos, entonces ya estamos a mitad de camino a nuestro objetivo. Lo que queremos es que la lista de nombres de archivos que se precedidos por "procfile.bat" con un cambio - necesidades procfile.bat ser llamados. Ahora tenemos un archivo por lotes que va a hacer todo el trabajo por nosotros:

llame miarchivo.txt procfile.bat

llame yourfile.txt procfile.bat

llame theirfile.txt procfile.bat

...

Por supuesto, este es el tipo de cosa que TEXTools sobresale en hacerlo. Agregar el texto, "llame procfile.bat" al frente de cada línea en un archivo de texto que contiene cientos de nombres de archivo - con el fin de crear y ejecutar un archivo por lotes en la marcha es muy fácil:

Tipo ListOfFiles.txt | tcl InsStr 1 'call procfile.bat'> t $ 1.bat

llamar a t $ 1.bat

Ahora estamos listos para hacer frente a nuestro trabajo, salvo por una pieza del rompecabezas que falta. Necesitamos nuestro procfile.bat. La nuestra tiene que tomar como argumentos un nombre de archivo, un texto de búsqueda y reemplazo de texto:

ProcFile

Internamente, ProcFile.bat será editar el fichero dado mediante la sustitución de todas las apariciones de a en el archivo. Fundamentalmente, esto se podría hacer con sólo dos líneas de código (bajo Windows 95 y 98, etc esto se podría hacer en una sola línea sin la necesidad de un archivo intermedio temporal):

tipo% 1 | tcl "ReplStr '% 2' '% 3'"> t $ 1.txt

Tipo T $ 1.txt> 1%

En realidad, necesitamos un poco más de esto, sin embargo. ¿Qué pasa si no se especifica el texto de búsqueda o texto de sustitución que tiene espacios en blanco incrustados? Esto sólo puede hacerse en el símbolo del sistema mediante el uso de las comillas dobles que rodean este modo:

ProcFile miarchivo.txt "coche rojo", "coche azul"

El problema es que estos circundantes comillas dobles son parte del parámetro en lo que se refiere a Windows. En lo que a nosotros respecta Sin embargo, no es por lo que debe deshacerse de ellas. Una vez más, esta es una cuestión simple usando TEXTools:

echo% 2 | tcl "ReplStr '# 22''' | InsStr 1 'buscar set =" "> t $ 1.bat

echo% 3 | tcl "ReplStr '# 22''' | InsStr 1" Limitar = "" >> t $ 1.bat

llamar a t $ 1.bat

Estas tres líneas mágicas simplemente eliminar las comillas dobles que rodean a cada uno de los search / reemplazar los parámetros que se pasan al ProcFile. No es que los mismos parámetros se alteran de ninguna manera. Su contenido no cotizadas son más que copian en las variables de entorno! Observe de nuevo el uso de un archivo de proceso por lotes en la marcha de lograr esto. Que se establecen las pistas ...

Así que ahora, nuestro ProcFile.bat ve algo como esto:

:: Retire los alrededores comillas dobles de la búsqueda / reemplazar texto ...

echo% 2 | tcl "ReplStr '# 22''' | InsStr 1 'buscar set =" "> t $ 1.bat

echo% 3 | tcl "ReplStr '# 22''' | InsStr 1" Limitar = "" >> t $ 1.bat

llamar a t $ 1.bat

:: Realizar reemplazos de texto en el archivo ...

tipo% 1 | tcl "ReplStr '%% search', '%% reemplazar'"> t $ 1.txt

Tipo T $ 1.txt> 1%

Tenga en cuenta que se trata de una aplicación muy básicos de ProcFile.bat. Normalmente, usted incluye una lógica de abortar la ejecución si no se suministran todos los parámetros, etc, pero esto es sólo una manifestación. Para los archivos de proceso por lotes reales, consulte la sección "Buscar y reemplazar" ejemplos disponibles en el paquete de descarga TEXTools (instalado debajo de la carpeta "Scripts de ejemplo") y también disponible en línea en [http://www.fireflysoftware.comTEXToolsexamples.htm]. Ahora, a cosas más grandes y mejores ...

Usando una búsqueda recursiva de archivos

Ahora que tenemos un archivo por lotes que realiza sustituciones de texto en un solo archivo, ¿cómo podemos emplear para procesar todos los archivos en una carpeta determinada y sus subcarpetas? La clave reside en el comando DIR. Cuando se utiliza con la / b / e interruptores s, las listas de comandos DIR (completo) todos los archivos de una carpeta (y todas sus subcarpetas) que responden a una especificación de archivo dado. Imagina que ... una lista de todos los archivos en una carpeta determinada y sus subcarpetas ese partido dicen, la especificación de archivo, "trabajo *. txt"! En la práctica, eso se traduce en una joya como esta:

dir% 1 / b / s | tcl "'call ProcFile.bat º 22' InsStr 1 | AppendStr '# 22% 2% 3"> t $ 2.bat

llamar a t $ 2.bat

Aquí está un archivo por lotes (por ejemplo, "Recursive.bat") que se puede llamar de la siguiente manera:

Trabajo recursiva *. Txt "esto" "que"

En este caso, sería reemplazar todas las instancias de "esto" con "que" en todos los archivos (en la carpeta y subcarpetas actual) coinciden con "trabajo *. Txt". No está mal para 7 líneas de código de lote, eh?

Mediante una lista de archivos

Si los archivos que desea editar se encuentran en un archivo de texto, el código de lote necesaria para procesarlos es casi idéntica a la anterior:

tipo% 1 | tcl "InsStr 1 'call ProcFile.bat º 22' | AppendStr '# 22% 2% 3"> t $ 2.bat

llamar a t $ 2.bat

La única diferencia es en donde la lista de archivos se origina. Con este enfoque, todo lo que necesitas es una lista de archivos en un archivo de texto para procesar. Este archivo por lotes que se podría llamar así:

ProcFileList FileList.txt "esto" "que"

Esto sería reemplazar todas las instancias de "esto" con "que" en todos los archivos que aparecen en FileList.txt.

Mediante una lista de reemplazos

Este último ejemplo de búsqueda y reemplazo realiza múltiples ediciones en un solo archivo mediante la utilización de un archivo que contiene múltiples search / replace pares. Una vez más, una llamada a ProcFile es todo lo que se necesita:

tipo% 2 | tcl "'call ProcFile.bat% 1' InsStr 1"> t $ 2.bat

llamar a t $ 2.bat

Este archivo por lotes, ya que podría ser llamado ProcReplList.bat. Así es como se llama para realizar múltiples search / operaciones de sustitución de MyFile.txt utilizando la búsqueda / reemplazo pares que se encuentran en Replacements.txt:

ProcReplList MyFile.txt Replacements.txt