Introducción a sed

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2008 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

Acerca de sed.

Sed es un editor de emisiones (stream editor) utilizado para el procesamiento de texto en ficheros. Utiliza un lenguaje de programación para realizar transformaciones en una emisión de datos leyendo línea por línea de estos. Fue desarrollado entre 1973 y 1974 por Lee E. McMahon de Bell Labs. Está incluido en las instalaciones básicas de prácticamente todas las distribuciones de GNU/Linux.

Procedimientos.

A continuación se mostrarán ejemplos del uso de sed.

Utilice vi para crear el fichero usuario.txt:

vi usuario.txt

Ingrese el siguiente contenido y salga de vi:

Fulano Algo
Calle Mengana 123
Colonia Perengana
Ciudad de Zutano, C.P. 123456

Si utiliza el mandato cat sobre el fichero, visualizará tal cual el contenido de usuario.txt como fue ingresado en vi.

cat usuario.txt

Si se quiere convertir a doble espacio la salida del fichero usuario.txt, utilice el siguiente mandato:

sed G usuario.txt

La salida devolverá lo siguiente:

Fulano Algo

Calle Mengana 123

Colonia Perengana

Ciudad de Zutano, C.P. 123456

Para guardar esta salida en el fichero usuario2.txt, utilice lo siguiente:

sed G usuario.txt > usuario2.txt

Si se quiere convertir a doble espacio la salida del fichero usuario.txt, utilice el siguiente mandato:

sed 'G;G' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo


Calle Mengana 123


Colonia Perengana


Ciudad de Zutano, C.P. 123456


Para guardar esta salida en el fichero usuario2.txt, utilice lo siguiente:

sed 'G;G' usuario.txt > usuario3.txt

El contenido de usuario3.txt tendrá triple espacio de separación. Si se desea convertir un fichero a doble espacio, pero que no haya más de una línea vacía entre cada lñíena con datos, se utiliza lo siguiente:

sed '/^$/d;G' usuario3.txt

La salida devolverá lo siguiente:

Fulano Algo

Calle Mengana 123

Colonia Perengana

Ciudad de Zutano, C.P. 123456

Si se desea eliminar el doble espacio del fichero usuario2.txt, se utiliza lo siguiente:

sed 'n;d' usuario2.txt

La salida devolverá lo siguiente:

Fulano Algo
Calle Mengana 123
Colonia Perengana
Ciudad de Zutano, C.P. 123456

Si se quiere agregar una línea en blanco arriba de toda línea que contenga la expresión regular enga, se utiliza lo siguiente:

 sed '/enga/{x;p;x;}' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo

Calle Mengana 123

Colonia Perengana
Ciudad de Zutano, C.P. 123456

Si se quiere agregar una línea en blanco debajo de toda línea que contenga la expresión regular 3, se utiliza lo siguiente:

sed '/3/G' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo
Calle Mengana 123

Colonia Perengana
Ciudad de Zutano, C.P. 123456

Si se quiere agregar una línea en blanco arriba y debajo de toda línea que contenga la expresión regular 3, se utiliza lo siguiente:

sed '/3/{x;p;x;G;}' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo

Calle Mengana 123

Colonia Perengana

Ciudad de Zutano, C.P. 123456

Para reemplazar texto se utiliza el modelo 's/texto/nuevo-texto/' donde texto puede ser también una expresión regular. En el siguiente ejemplo se reemplazarán las incidencias del número por el número 9:

sed 's/3/9/g' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo
Calle Mengana 129
Colonia Perengana
Ciudad de Zutano, C.P. 129456

En el siguiente ejemplo se reemplazan los espacios por tabuladores a todo lo largo de todas las líneas:

sed 's/\ /\t/g' usuario.txt

La salida devolverá lo siguiente:

Fulano  Algo
Calle	Mengana	123
Colonia	Perengana
Ciudad	de Zutano,	C.P.	123456

En el siguiente ejemplo se reemplazan solo el primer espacio de cada línea por un tabulador:

sed 's/\ /\t/' usuario.txt

La salida devolverá lo siguiente:

Fulano	Algo
Calle	Mengana 123
Colonia Perengana
Ciudad	de Zutano, C.P. 123456

La siguiente línea añade 5 espacios al inicio de cada línea:

sed 's/^/     /' usuario.txt

La salida devolverá lo siguiente:

     Fulano Algo
     Calle Mengana 123
     Colonia Perengana
     Ciudad de Zutano, C.P. 123456

El siguiente mandato solo imprime la primera línea del fichero usuario.txt:

sed q usuario.txt

La salida devolverá lo siguiente:

Fulano Algo

El siguiente mandato solo imprime las primeras dos líneas del fichero usuario.txt:

sed 2q usuario.txt

La salida devolverá lo siguiente:

Fulano Algo
Calle Mengana 123

El siguiente mandato solo muestra las últimas tres líneas del fichero usuario.txt:

sed -e :a -e '$q;N;4,$D;ba' usuario.txt

La salida devolverá lo siguiente:

Calle Mengana 123
Colonia Perengana
Ciudad de Zutano, C.P. 123456

El siguiente mandato solo mostrará las líneas que incluyen 3:

sed '/3/!d' usuario.txt

La salida devolverá lo siguiente:

Calle Mengana 123
Ciudad de Zutano, C.P. 123456

El siguiente mandato solo mostrará las líneas que no incluyen 3:

sed '/3/d' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo
Colonia Perengana

El siguiente mandato pide mostrar la linea que está inmediatamente después de la expresión Fulano, pero no la línea en si que incluye Fulano:

sed -n '/Fulano/{n;p;}' usuario.txt

La salida devolverá lo siguiente:

Calle Mengana 123

El siguiente mandato pide mostrar la linea que está inmediatamente antes de la expresión Calle, pero no la línea en si que incluye Calle:

sed -n '/Calle/{g;1!p;};h' usuario.txt

La salida devolverá lo siguiente:

Fulano Algo

Bibliografía.


Alcance Libre
http://www.alcancelibre.org/staticpages/index.php/introduccion-sed