Linuxsc.net - Buscar y reemplazar con el comando SED

Buscar y reemplazar con el comando SED

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] /g' filename.txt
# ssh 10.0.X.X "sudo sed -i 's/00/02/g'  /etc/crontab"


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 /g' 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 /' () \ ".