La versión de sed que incluyen las distribuciones GNU/Linux permite reemplazar cualquier cadena por saltos de línea (enter) utilizando la secuencia de escape \n. Sin embargo, la versión BSD no soporta estas secuencias de escape al momento de reemplazar (sí al momento de buscar, parte izquierda de la secuencia de sustitución).

En este breve artículo explico cómo lograrlo en FreeBSD y OpenBSD.



El objetivo es lograr lo que en Linux se hace con de la siguiente manera:

root@linuxito:~# echo "hola chau" | sed 's/ /\n/'
hola
chau

Por ejemplo, para reemplazar espacios en blanco por saltos de línea (newline).

En sistemas FreeBSD esto no funciona, pero es posible reemplazar por saltos de línea de manera literal, sólo basta con utilizar caracteres de escape:

emi@hal9000:~ % echo $SHELL
/bin/tcsh
emi@hal9000:~ % echo -n "hola chau" | sed 's/ /\\
/'
hola
chau

Si se utiliza la shell csh (tcsh, shell por defecto en FreeBSD) es necesario insertar dos caracteres de escape (barra invertida). Esto se debe a que el primero es consumido por csh para detectar la continuación del comando, mientras que el segundo es consumido por sed para detectar la continuación del patrón de reemplazo.

Si en cambio se utiliza bash, sólo es necesario utilizar un escape:

emi@hal9000:~ % bash
[emi@hal9000 ~]$ echo -n "hola chau" | sed 's/ /\
> /'
hola
chau

En sistemas OpenBSD sucede algo similar a FreeBSD, aunque ksh (al igual que bash) no consume el escape, por lo que basta con utilizar sólo uno:

# echo $SHELL
/bin/ksh
# echo "hola chau" | sed 's/ /\ 
> /'
hola
chau


Tal vez pueda interesarte


Compartí este artículo