Comando 'sed' de Linux: reemplazar texto, ejemplos...

Comando 'sed' de Linux: reemplazar texto, ejemplos...

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 (sed -r, sed -e, sed -f…). En este artículo te enseñamos varios trucos y algunas de las opciones que hemos considerado más útiles, entre algunos ejemplos.

¿Cómo reemplazar texto 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 las líneas pares:
sed '1~2d'
  • Todas las 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
Alrededor del mismo tema

Linux