![GNU sed --posix y carácter de nueva línea en la cadena de reemplazo](https://rvso.com/image/168813/GNU%20sed%20--posix%20y%20car%C3%A1cter%20de%20nueva%20l%C3%ADnea%20en%20la%20cadena%20de%20reemplazo.png)
En la sed
especificació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 sed
comando GNU con --posix
bandera 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é sed
se 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.
\n
esnouna nueva línea literal.
Respuesta2
La --posix
bandera hace sed
compatible 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 x
con 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 sed
quiera cambiar su comportamiento allí.
un conformesolicitud(es decir, guión en ese caso) no debe usarse \n
allí, de eso se trata el texto que cita.
La diferencia es s/[\t]/x/g
que POSIX requiere que reemplace ambos \
y t
con x
, y verá el comportamiento de sed
los cambios de GNU --posix
allí. Para s/[\n]/x/g
, la especificación POSIX es en realidad ambigua. GNU sed
cambia su comportamiento con --posix
para reemplazar \
y n
con 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.