Comando 'sed' de Linux: cómo usarlo, ejemplos, opciones...

Comando 'sed' de Linux: cómo usarlo, ejemplos, opciones...

Sed (Stream EDitor) es un comando de Linux que se utiliza para modificar las líneas de un fichero aplicando una serie de comandos específicos. En este artículo te enseñamos varios trucos y algunas de las opciones que hemos considerado más útiles.

¿Cómo sustituir con sed?

Sustituir "foo" por "bar" en todas las líneas:

  • Solo en la 1ª ocurrencia:
sed 's/foo/bar/'
  • Solo en la 3ª ocurrencia:
sed 's/foo/bar/3'
  • En todas las ocurrencias:
sed 's/foo/bar/g'
  • Sólo en la penúltima ocurrencia:
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/'
  • Sólo en la última ocurrencia:
sed 's/\(.*\)foo/\1bar/'
  • Solo en las líneas que contienen “plop”:
sed '/plop/ s/foo/bar/g'
  • Menos en las líneas que contienen “plop”:
sed '/plop/! s/foo/bar/g'
  • Sustituir "Foo" o "foo" por “bar” en todas las líneas:
sed 's/[Ff]oo/bar/g'
  • Sustituir "azul", "blanco" o “rojo” por “verde”:
sed 's/azul\|blanco\|rojo/verde/g'

¿Cómo visualizar con sed?

  • La primera línea (head -1):
sed q
  • Las 5 primeras líneas (head -5):
sed '5q'
sed '1,5!d'
  • La última línea (tail -1):
sed -n '$p'
sed '$!d"
  • Las 5 últimas líneas (tail -5):
sed -e :a -e '$q;N;6,$D;ba'
  • Las 2 últimas líneas (tail -2):
sed '$!N;$!D'
  • Sólo las líneas que coinciden con un patrón o expresión regular:
sed -n '/patrón/p'
sed '/regexp/!d'
  • Sólo las líneas que no coinciden con un patrón o expresión regular:
sed -n '/patrón/!p'
sed '/regexp/d'
  • La línea anterior a un patrón o expresión regular:
sed -n '/patrón/{g;1!p;};h'
  • La línea que sigue a un patrón o expresión regular:
sed -n '/regexp/{n;p;}'

¿Cómo eliminar con sed?

Espacio y tabulación

  • Al inicio de línea:
sed 's/^\s*//'    # Uso del parámetro "\s"
sed 's/^[ \t]*//
  • Al final de la línea:
sed 's/[ \t]*$//'
  • Al inicio y al final de la línea:
sed 's/^[ \t]*//;s/[ \t]*$//'

Línea vacía

  • Todas las líneas vacías:
sed '/./!d'
sed '/^$/d'
  • Solo las del encabezado:
sed '/./,$!d'
sed -nr '/./,$s/(.*)/\1/p'
  • Solo las del final:
sed -e :a -e '/^\n*$/ {$d;N;ba' -e '}'

Intervalo regular

  • Todas la líneas pares:
sed '1~2d'
  • Todas la líneas impares:
sed '2~2d'
  • Todas las n líneas a partir de la línea n:
sed '3~2d'  # Todas las 2 líneas a partir de la línea 3

¿Cómo unir líneas con sed?

  • Unir líneas de dos en dos:
sed '$!N;s/\n//'
  • Unir líneas de tres en tres:
sed '$!N;s/\n//;$!N;s/\n//;'
  • Si una línea termina en un backslash (\), agregar la línea siguiente y reemplazar el final de línea (/n) por un espacio:
sed -e :a -e '/\\$/N; s/\\\n/ /; ta'
  • Si un línea comienza con un signo igual (=), agregarla a la línea precedente y reemplazar el signo igual (=) por un espacio:
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

¿Cómo no tener en cuenta las mayúsculas y minúsculas?

El comando sed posee un flag que permite buscar un patrón sin tener en cuenta las mayúsculas y minúsculas, pero este se aplica únicamente al comando de sustitución (comando s). A continuación, veremos un truco que permite utilizar este flag para mostrar (o no) líneas que coinciden con un patrón dado sin tener en cuenta las mayúsculas y minúsculas. Para ello, tan solo hay que utilizar el comando de sustitución “s” asociado al [metacaracter "&"] y al flag “I”. Un ejemplo para mostrar únicamente las líneas que contienen el término “patron” sería:

sed -n 's/patron/&/Ip' fichero

Linux