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