En el nivel más básico, ya existe una asimetría entre las partes de búsqueda y reemplazo :substitute
porque la primera es una expresión regular y la segunda es texto, con secuencias de escape adicionales específicas . Esto solo se destaca por la intuición que tienes sobre lo que \n
significa.
Por ejemplo, considere que \n
en la búsqueda no coincide con un literal \n
. Se coincide con el final de la secuencia de bytes de línea (EOL), que puede ser \r
, \r\n
, o simplemente \n
en función de la 'fileformat'
de la memoria intermedia.
En cuanto a por qué \r
se usa para significar "insertar una EOL", hay algo de historia detrás de eso. Vi no tenía forma de manejar un byte NUL en un archivo. Vim mejoró eso al reemplazar los bytes NUL con un byte NL internamente (ya que las cadenas C están delimitadas por NUL).
Este detalle de implementación se filtró en el comportamiento de :substitute
ya que \n
en el reemplazo simplemente se inserta en la representación interna de esa línea, que se utiliza para indicar un byte NUL. \r
inserta una EOL, rompiendo la línea interna en dos. Vim en realidad no almacena los bytes EOL en la memoria, sino que (los) serializa cuando lee / escribe el búfer.
No se puede cambiar ahora sin romper los muchos scripts y la memoria muscular de muchos usuarios. Afortunadamente, está documentado en :help sub-replace-special
.
\r
es<CR>
y\n
es<LF>
. No aborda la pregunta real de por qué\n\r
comportarse de manera diferente en diferentes contextos.