El shell de linux: Comando sed | Algo de Linux

lunes, 3 de marzo de 2008

El shell de linux: Comando sed

Este comando también lo usamos mucho, porque nos permite, de una forma cómoda, borrar líneas, registros o sustituir cadenas de caracteres dentro de las líneas.

Para borrar una línea hacemos lo siguiente:

    sed 'nº_de_línead' fichero

Podemos indicar un número de línea concreto. Por ejemplo:

    sed '1d' fichero

Podemos indicar un intervalo de líneas a borrar. Por ejemplo:

    sed '3,5d' fichero

También podemos indicar que queremos borrar desde una determinada línea en adelante:

    sed '3,$d' fichero

Otro ejemplo útil es borrar las líneas en blanco de un fichero:

    sed '/^$/d' fichero

A la hora de borrar, también podemos especificar una cadena, de tal forma que el comando borrará todas las líneas que contengan esa cadena. Ejemplo:

    cat fichero | sed '/^[ ]*$/d' > ficherodestino

Lo anterior borrará todas las líneas en blanco de fichero.

Otro de los usos interesantes es borrar los espacios al comienzo de cada línea:

    sed 's/^ *//g' fichero

O borrar los espacios al final de cada línea:

    sed 's/ *$//g' fichero

Otro de los usos más interesantes de sed es sustituir cadenas. Podemos sustituir una cadena por otra de la siguiente manera:

    sed 's/cadena1/cadena2/' fichero

Al ejecutar el comando anterior, se sustituye la primera cadena que encuentra por la segunda. Pero, si lo que queremos es sustituir todas las cadenas que encuentre, en cada una de las líneas, añadimos el parámetro g:

    sed 's/cadena1/cadena2/g' fichero

Por otra parte, también podemos hacer que sustituya la cadena1 por la cadena2 en un número de línea concreto:

    sed '5 s/USUARIO/usuario/g' fichero

Con cadenas de texto normales la cosa es sencilla, pero al que más y al que menos le resulta complicado cuando lo que hay que sustituir son caracteres especiales como el tabulador: \t o el caracter de nueva línea: \n. Pero veamos como tampoco es complicado: Imaginemos que tenemos un fichero con campos en los que el separador es el tabulador y queremos sustuir este caracter separador por otro caracter separador, como por ejemplo el punto y coma (;). Lo haremos de la siguiente manera:

    sed 's/\t/;/g' fichero

19 comentarios:

Anónimo dijo...

Gracias Muy Util.

Harvey Jarquin.

Esteban M. Navas Martín dijo...

No hay de qué. Encantado de que te haya servido.

Sotelo dijo...

Muchas gracias, era justo lo que estaba buscando...

Anónimo dijo...

Muy, muy clarito!!

Anónimo dijo...

Muy "tuxelente" hermano...Entendí full...De veras que te lo agradezco.

Anónimo dijo...

Excelente comando, gracias por publicarlo.

Anónimo dijo...

Gracias, me ayudaste a saber como cambiar las lineas de un fichero pero recursivamente y no solo la primera, en hora buena. Nuevamente, muchas gracias.

Migue Chan dijo...

Muchas gracias Esteba, me ha servido de mucho para... asuntos del trabajo XD
Tenía que sustituír un montón de comas por otro caracter, pero ya está hecho, saludos desde BlueLeafLinux.

tombe85 dijo...

muchas gracias! no entendía muy bien sed, pero lo has dejado bastante claro :)

Un saludo!

Anónimo dijo...

me dio sed

Anónimo dijo...

Tengo un archivo con datos agrupados en una cantidad variable de lineas consecutivas y separados entre ellos por uno o dos espacios en blanco del tipo:

gonzalez
antonio gonzalez izquierdo
c/ buendia 12
madrid

rodriguez
jose rodriguez gomez
informatico de cuidado
un buen elemento
c/ norte 23
segovia

gutierrez
cuesta de arriba 27
ciudad real

Quisiera enviar cada grupo de datos de este documento a un archivo. En el ejemplo que he puesto tendría que dar como resultado 3 ficheros: uno con los datos de gonzalez, otro con los datos de rodriguez y el último con los de gutierrez.
Estoy batallando con sed y awk pero mis conocimientos de bash scripting son más bien escasos. ¿Puedes echarme una mano?

Anónimo dijo...

Exelente, corto pero eficaz

Anónimo dijo...

Y si tengo un fichero con lineas, y otro fichero con esas mismas y otras lineas, cómo podría usar sed para eliminar del segundo todas las lineas del primer fichero?

Es decir:
fichA:
aaa
bbb

fichB:
aaa
fff
ggg
bbb
hhh

Quiero que me quede en fichB lo que había menos las lineas de fichA:
fff
ggg
hhh

cgz - capacitarme por internet dijo...

Buenas, muchas gracias por el tutorial, quisiera saber como puedo eliminar todas las lineas de un determinado archivo.. lo puedo hacer con sed?
Agradeceré su ayuda...

Esteban M. Navas Martín dijo...

¿Qué es lo que quieres hacer? ¿Te refieres a vaciar el contenido de un archivo, dejándolo en blanco?

Jose Alberto Gallardo Pérez dijo...

Muchas Gracias por el post, mañana justo tengo el examen de shell script de Linux y este comando es esencial. Gracias

Sergio Daniel dijo...

Muchisimas gracias amigo, es justo lo que andaba buscando para un shellscript que estoy haciendo, le estoy muy agradecido porque además se explicó realmente bien.

Anónimo dijo...

Alguien sabe que está haciendo el comando sed en este caso?

sed '0d' '{}' \; > Nombre_fichero.txt

Anónimo dijo...

Muy bueno
se agracede