sed: editor de flujos de texto

bar-neon-sign


Teneis sed? Pues veniros a elbinario.net!

En casi todos los sistemas GNU/Linux viene de serie una herramienta muy útil y que algunos no conocen. Es el comando sed. Hay varias versiones pero la más usada es gnu sed.

Pero no vamos a hablar del comando, sus parametros (para eso teneis el manual de sed) y sus innumerables aplicaciones sino de una recopilación de ellas que podemos encontrar en un archivo de texto http://sed.sourceforge.net/sed1line.txt

sed1line es eso, un archivo con chuletas para las que puedes aplicar sed. Hay muchas y variadas que te podrian ser útiles en algun momento, asi que merece la pena leerlo.

Casi todas usan expresiones regulares complejas y es ahí donde reside su fuerza.

Es una pena que no este traducido al español asi que de momento nos tenemos que quedar con la versión inglesa.

Trucos de consola usando sed

# convertir finales de linea tipo DOS (CR/LF) a formato Unix.
sed 's/.$//'               # asume que todas las lineas terminan con CR/LF
sed 's/\x0D$//'            # funciona con ssed, gsed 3.02.80 o superior

# borrar espacios en blanco al principio y el final de cada linea
 sed 's/^[ \t]*//;s/[ \t]*$//'

# aliniar el texto a una anchura de 79 columnas
 sed -e :a -e 's/^.\{1,78\}$/ &/;ta'  # set at 78 plus 1 space

# sustituir "foo" por "bar" en cada linea
 sed 's/foo/bar/'             # sustituir solo la primera ocurrencia en la linea
 sed 's/foo/bar/4'            # sustituir solo la cuarta ocurrencia en la linea
 sed 's/foo/bar/g'            # sustituir todas las veces que se encuentre
 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # sustituir solo la anteultima ocurrencia
 sed 's/\(.*\)foo/\1bar/'            # sustituri solo la ultima ocurrencia

# sustituir "foo" por "bar" SOLO en las lineas que contengan "baz"
 sed '/baz/s/foo/bar/g'

# sustituir "foo" por "bar" EXCEPTO en las lineas que contengan "baz"
 sed '/baz/!s/foo/bar/g'

# mostrar la linea numero 52
 sed -n '52p'                 # metodo 1
 sed '52!d'                   # metodo 2
 sed '52q;d'                  # metodo 3, eficiente para ficheros grander

# quitar la mayoria de los tags HTML (reconoce tags multilinea)
 sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

Emular algunos comandos

# contar lineas (emula "wc -l")
 sed -n '$='

# ordenar lineas al reves (emula "tac")
 sed '1!G;h;$!d'               # metodo 1
 sed -n '1!G;h;$p'             # metodo 2

# invierta cada caracter de la linea (emula "rev")
 sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

# junta pares de lineas lado a lado (emula "paste")
 sed '$!N;s/\n/ /'

# muestra las 10 primeras lineas (emula "head")
 sed 10q

# muestra la 10 ultimas filas (emula "tail")
 sed -e :a -e '$q;N;11,$D;ba'

# muestra solo las lineas que se ajustan a la expresion regular (emula "grep")
 sed -n '/regexp/p'           # metodo 1
 sed '/regexp/!d'             # metodo 2

# borra lineas duplicadas consecutivas (emula "uniq")
 sed '$!N; /^\(.*\)\n\1$/!P; D'

Seguro que muchos que leen esto saben más trucos con sed asi que os animo a publicarlos en los comentarios ;)

Referencias:
http://sed.sourceforge.net/sed1line.txt
http://sed.sourceforge.net/sedfaq.html
https://www.gnu.org/software/sed/manual/sed.html

Compartir

4 Comentarios

  1. gracias por la guia, en su momento conoci las regexp gracias a emacs, al perder el miedo utilce sed, luego salte a awk, despues escribi mi propia libreria de expresiones y… en algun momento probare python cuando me deje de probocar sueño…, por ahora a quien no conosca las regexp o emacs le recomedaria awk que mantiene un balance entre posibilides y «claridad» de lo que se quiere hacer.

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax