GNU/Linux >> Tutoriales Linux >  >> Linux

¿Diferencias entre Sed en Mac Osx y otros Sed "estándar"?

Tengo algunos problemas para usar una respuesta provista en este sitio para esta pregunta sobre un comando sed para reemplazar una línea en blanco con otras dos líneas de contenido, y apareció si el comando sed en Mac OS (10.6.7 para mí ) es diferente. No creo que lo sea, pero me preguntaba si otros en este sitio pensaron diferente.

Respuesta aceptada:

El comportamiento de las utilidades de shell difiere en aspectos menores entre las variantes de Unix. Hay muchas variantes de Unix, con una historia compleja. Hay esfuerzos de estandarización como el estándar POSIX y su superconjunto, la especificación Single UNIX. La mayoría de los sistemas hoy en día implementan POSIX:2001, también conocida como Single UNIX Specification versión 3, con desviaciones menores y muchas extensiones. La especificación Single Unix no es un tutorial, pero la versión 3 se puede leer si ya tiene una idea de lo que está haciendo un comando. Puede consultarlo para saber si alguna característica es estándar o una extensión de un sistema en particular.

La mayoría de los usuarios de Unix usan Linux y no han usado ninguna otra variante. Linux viene con utilidades GNU, que a menudo tienen muchas extensiones del estándar. Así que encontrará una gran cantidad de código que funciona en Linux pero no en otros unices, porque se basa en esas extensiones.

Con respecto a sed, consulte la especificación sed Single Unix para conocer el mínimo que se supone que debe admitir cada sistema, la página de manual de su sistema para conocer lo que admite su implementación y el manual GNU sed para conocer lo que usa la mayoría de la gente.

Una de las extensiones no estándar de GNU sed admite varios comandos que se ejecutan juntos. Por ejemplo, este programa GNU sed imprime todas las líneas que contienen un a , pero cambia b en c primero:

sed -ne '/a/ {s/b/c/g; p}'

{ y } en realidad son comandos separados, por lo que para una portabilidad completa, debe especificarlos en líneas separadas (en un archivo) o en -e separados argumentos (en la línea de comando). La falta de un separador de comando después de { y el uso de ; como separador de comandos son extensiones comunes. La falta de un separador de comando antes de } es una extensión menos común. Esto es compatible con el estándar:

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

Esto no es estándar pero se acepta comúnmente:

sed -ne '/a/ { s/b/c/g; p; }'

Otra extensión no estándar pero común es el uso de \n para significar una nueva línea en un s texto de reemplazo (el uso en una expresión regular es estándar). El método portátil es incluir una barra invertida-nueva línea en el script sed. Otra extensión común es \+ , \? y \| en expresiones regulares para significar uno o más, como máximo uno y alternancia; Las expresiones regulares básicas portátiles no tienen ninguno de estos. Por ejemplo, el primer comando es una forma no portátil de reemplazar secuencias contiguas de espacios en blanco por una nueva línea; el segundo comando es un equivalente que cumple con los estándares.

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'

Linux
  1. ¿Diferencia entre tubería y expansión de comando?

  2. ¿Diferencias entre volumen, partición y disco?

  3. ¿Cómo ignorar algunas diferencias en el comando diff?

  4. Diferencias de subcapa entre bash y ksh

  5. diferencia de linux entre sudo crontab -e y simplemente crontab -e

¿Cuál es la diferencia entre el comando apt y apt-get?

Vim vs Vi:¿similitudes y diferencias entre VIM y VI?

Diferencias entre cortafuegos de hardware y software

Diferencias entre nobootwait y nofail en los sistemas de archivos de Linux

Cómo compartir archivos entre Ubuntu y Mac OS X

¿Diferencia entre '{}' y {} en el comando de búsqueda?