|
Lunes, 25 de Mayo de 2009 06:31 |
|
Cuando se trabaja en la lÃnea de comandos de Linux y se encuentra con un archivo grande o un gran número de archivos en los que usted necesita para reemplazar a un determinado texto con otro, la búsqueda y pegar en cada instancia del texto puede ser un poco tiempo.
Bueno, no te preocupes más. Linux acaba de la solución para usted. He aquà una forma de buscar y reemplazar una cadena de texto en uno o más archivos automáticamente.
Para los efectos de este ejercicio vamos a utilizar una herramienta de lÃnea de comandos de Linux llamada "sed".
"Sed" es una poderosa y versátil herramienta, y mucho se puede escribir acerca de sus capacidades. Estamos utilizando un aspecto muy limitado de "sed" aquÃ. Sin duda recomiendo que lea un poco más en la "sed", si usted encuentra este interesante aspecto de la misma.
Vamos a usar la siguiente sintaxis para buscar y reemplazar una cadena de texto en un archivo:
# sed -i 's/ [orginal_text] / [new_text] /' filename.txt
Cambiar de /usr/bin/ --> /usr/local/bin/ sed 's/\/usr\/bin\//\/usr\/local\/bin\//g'
Digamos que se tiene un archivo llamado "database.txt" con numerosos ejemplos de la dirección IP de su servidor de base de datos en ella. El cual uno acaba de cambiar a un nuevo servidor de base de datos y la necesidad de actualizarlo con la nueva dirección IP del servidor. La antigua dirección IP es 192.168.1.16 y la nueva es 192.168.1.22. Aquà está cómo hacerlo:
# Cat database.txt LOCAL_DATABASE = 192.168.1.16 LOCAL_DIR = / home / calvin / PROD_DB = 192.168.1.16
# sed -i 's/192.168.1.16/192.168.1.22/g' database.txt #cat en database.txt LOCAL_DATABASE = 192.168.1.22 LOCAL_DIR = / home / calvin / PROD_DB = 192.168.1.22
Ahora abra el archivo "database.inc" y compruebe si la nueva dirección IP ha tenido lugar de su vieja. Esta es la disolución de la anterior comando. Primero llame a la "sed" de mando. Luego de pasar el parámetro "-s", que significa "en lugar de".
Ahora usamos un poco de las expresiones regulares, comúnmente conocida como "la expresión regular" para el siguiente bit. La "s" en la citada cadena significa "sustituto" y "g" al final significa "global". Entre ellos se traducen en un "mundial de la sustitución de la cadena de texto que en el lugar entre ellos.
Opcionalmente se puede omitir la "g" al final. Esto significa que la sustitución no será mundial, que prácticamente se traduce en la sustitución de sólo la primera instancia de la cadena en una lÃnea. Asà que si habÃa una lÃnea con varias instancias del texto que usted está tratando de sustituir, esto es lo que sucederá
# cat database.txt LOCAL_DATABASE = 192.168.1.16 LOCAL_DIR = / home / calvin / PROD_DB = 192.168.1.16, 192.168.1.16
# sed -i 's/192.168.1.16/192.168.1.22 /' database.txt # Cat database.txt LOCAL_DATABASE = 192.168.1.22 LOCAL_DIR = / home / calvin / PROD_DB = 192.168.1.22, 192.168.1.16
Aquà viene la magia real. Ahora, digamos que usted desea cambiar una cadena de texto no sólo en un único archivo, pero en todo el directorio en el que se in Hay una serie de archivos de texto en el que usted necesita para encontrar y reemplazar el "vino" con "champagne" .
# find . maxdepth-1-name "*. txt" -type f -exec sed -i 's / vino / champán /' {} \; # find . -type f -exec sed -i s/cadenaVieja/cadenaNueva/g {} \;
Usamos el comando find para obtener una lista de todos los archivos de texto en el directorio actual.
Ese es el "encontrar. maxdepth-1-name "*. txt"-type f "parte. "Encontrar. Maxdepth 1" decirle al ordenador a buscar en el directorio actual y no van más profundo que el directorio actual. La "-name" *. txt " 'le dice a encontrar parte de la lista sólo los archivos con la extensión". Txt ". Entonces, el "tipo f" especifica que la sección "Buscar" sólo debe recoger los archivos que se correspondan exactamente. Por último, el "exec" parte dice "Buscar" para ejecutar el comando que sigue, que, en este caso, es la "sed" para sustituir el texto - "sed-i 's / vino / champán /' () \ ".
|
|
Última actualización el Viernes, 11 de Marzo de 2011 11:52 |