GNU sed --posix y carácter de nueva línea en la cadena de reemplazo

GNU sed --posix y carácter de nueva línea en la cadena de reemplazo

En la sedespecificación POSIXesta declaraciónse encuentra (énfasis mío):

La secuencia de escape '\n' coincidirá con una <nueva línea> incrustada en el espacio del patrón.No se utilizará una <nueva línea> literalen el BRE de una dirección de contexto oen la función sustitutiva.

El siguiente sedcomando GNU con --posixbandera es contrario a esa especificación, porque se utiliza una nueva línea en la función sustituta.

$ printf '1X2' | sed --posix 's|X|\n|'
1
2

Entonces, ¿por qué sedse insertó una nueva línea en lugar de mostrar un mensaje de error?

Respuesta1

"No se utilizará una <nueva línea> literal". No se utiliza ninguna nueva línea literal en su ejemplo. Por lo tanto esta parte de la norma no es relevante.

\nesnouna nueva línea literal.

Respuesta2

La --posixbandera hace sedcompatible con GNU POSIX.

POSIX deja el comportamiento sin s/x/\n/especificar:

No se especifica el significado de una <barra invertida> sin escape seguida inmediatamente por cualquier carácter que no sea '&', <barra invertida>, un dígito, <nueva línea> o el carácter delimitador utilizado para este comando.

Por lo tanto, reemplazar xcon n, con \n, con nueva línea, informar un error, reiniciar su computadora son comportamientos compatibles. No hay ninguna razón por la que GNU sedquiera cambiar su comportamiento allí.

un conformesolicitud(es decir, guión en ese caso) no debe usarse \nallí, de eso se trata el texto que cita.

La diferencia es s/[\t]/x/gque POSIX requiere que reemplace ambos \y tcon x, y verá el comportamiento de sedlos cambios de GNU --posixallí. Para s/[\n]/x/g, la especificación POSIX es en realidad ambigua. GNU sedcambia su comportamiento con --posixpara reemplazar \y ncon x, pero no está tan claro si es necesario o no.

Respuesta3

La norma especifica que en elpatrón de búsqueda(BRE, expresión regular básica, en lenguaje POSIX) no se puede utilizar ninguna nueva línea explícita, y una nueva línea está representada por '\n'; y no se puede utilizar en elreemplazocualquiera.

Su patrón de búsqueda no incluye nuevas líneas, explícitas o representadas por '\n'. Tienes un '\n' en el reemplazo. Lo anterior no dice cómo se debe representar una nueva línea (si es que se representa) en el texto de reemplazo. GNU sed toma lo anterior diciendo que reemplazar por '\n' significa introducir una nueva línea. Sensitivo.

información relacionada