Bucar y reemplazar en vi / vim

30 08 2012

Para buscar en vi o vim:

Primero cambiar a modo normal “ESC”

– Buscar hacía atrás: ? TEXTO
– Buscar hacía adelante: / TEXTO
– Repetir búsqueda: n
– repetir búsqueda hacía atrás: N
– Reemplazar en la primera coincidencia en la misma línea: :s/VIEJO/NUEVO
– Reemplazar en toda la linea: :s/VIEJO/NUEVO/g
– Reemplzar entre unas lineas #,#: :#,#s/VIEJO/NUEVO/g
– Reemplzar en todo el archivo: :%s/VIEJO/NUEVO/g

Advertisements




Guía rápida del comando sed

23 05 2011

El comando sed se utiliza para realizar sustituciones en ficheros de manera rápida:# sed -opción s/EXPRESIÓN/sustitución/opción archivo.txt
Sustituir todos las palabras que contienen lisa por Lisa y casa por Casa, se pueden pasar varios parámetros a la vez con la opción “-e” o con “;”:# sed -e 's/lisa/Lisa/' -e 's/casa/Casa/' archivo.txt
# sed -e 's/lisa/Lisa/'; 's/casa/Casa/' archivo.txt

También se puede crear un script, un archivo con el contenido del tipo:"s/EXPRESIÓN/sustitución/opción"que recogerá sed así:# sed -f script.txt archivo.txt

Como opciones, se pueden pasar las siguientes variables:

g – Aplicar los cambios globalmente
p – Muestra las líneas que contienen el patrón a sustituir
(número) – Sustituye el patrón sólo las veces que se indiquen
w – Escribe las líneas sustituidas a un fichero especificado
I – Ignora mayúsculas y minúsculas

Reemplazar las cinco primeras coincidencias:# sed s/hola/Hola/5 archivo.txt

Sustituir entre la línea 3 y 10 un patrón dado:# sed '3,10s/hola/Hola/' archivo.txt

Sustituir el patrón en todas las líneas menos la primera:# sed '!1s/hola/Hola/' archivo.txt

Sustutir la última línea:# sed '$s/hola/Hola/' archivo.txt

Sustituir y/o reemplazar el mismo archivo: # sed -ie 's/hola/Hola/g' archivo.txt

Sustituir varios archivos recursivamente, para ello hay que utilizar el siguiente script:
# /bin/bash
find . -type f -name '*' -print |
while read filename
do
(
sed -i -e 's/TEXTOVIEJO/TEXTONUEVO/i;' $filename
)
done





Sustituir un patrón dentro de varios archivos recursivamente

24 02 2011

Si tenemos que cambiar una línea por otra dentro de multitud de archivos y éstos se encuentran dentro de un árbol de directorios, se puede usar el siguiente script para realizarlo de manera rápida, el ejemplo muestra como hacerlo dentro de un repositorio de subversion:

#!/bin/sh
VAR1=""
echo "Número de archivos que se van a sustituir (Que contienen el viejo patrón):"
rgrep 'PATRÓN-VIEJO' * | wc -l
echo "Número de archivos que contienen el nuevo patrón:"
rgrep 'PATRÓN-NUEVO' * | wc -l
VAR1=`rgrep 'PATRÓN-VIEJO' * | grep -v '.svn' | awk -F : '{print $1} '`
echo $VAR1 | xargs perl -pi -e 's/PATRÓN-VIEJO/PATRÓN-NUEVO/g'
echo "Número de archivos que se contienen el viejo patrón:"
rgrep 'PATRÓN-VIEJO' * | wc -l
echo "Número de archivos que contienen el nuevo patrón:"
rgrep 'PATRÓN-NUEVO' * | wc -l

También se puede hacer con un sed:
sed -i 's/UnaCosa/OtraCosa/g' archivos*.txt