¿Por qué es \ ra nueva línea para Vim?

255

De la pregunta ¿Cómo reemplazar un personaje para una nueva línea en Vim? . Debe usar \ r cuando reemplace el texto de una nueva línea, como este

:%s/%/\r/g

Pero al reemplazar el final de las líneas y las nuevas líneas para un personaje, puede hacerlo como:

:%s/\n/%/g 

¿Qué sección del manual documenta estos comportamientos y cuál es el razonamiento detrás de ellos?

Vinko Vrsalovic
fuente
1
¿Para qué sirve %buscar y reemplazar?
qed
77
@qed: por defecto :ssolo aplicará la sustitución a la línea actual. :%shace que aborde todo el archivo. Más .
c24w
3
+ c24w Creo que se está refiriendo al '%' entre las barras, el primer ejemplo el '%' está en la ubicación de búsqueda, y en la ubicación de reemplazo en el segundo ejemplo, pero @qed para responder a su pregunta, esos '% 's coinciden literalmente.
RastaJedi

Respuestas:

156

De vim docs en patrones :

\r coincide con <CR>

\n coincide con un final de línea: al coincidir en una cadena en lugar de texto de búfer, se coincide con un carácter de nueva línea literal.

pjz
fuente
41
Para mí, el punto de confusión es que \ r y \ n significan cosas diferentes cuando se usan es el patrón de búsqueda y el patrón de reemplazo.
dlamblin
3
@dlamblin ¡Sí! Ver mi respuesta :)
Expiación limitada
208

De http://vim.wikia.com/wiki/Search_and_replace :

Al buscar

...

\nes nueva línea, \res CR(retorno de carro = Ctrl-M= ^M)

Al reemplazar

...

\res nueva línea, \nes un byte nulo ( 0x00).

Expiación limitada
fuente
66
Esta respuesta me ayudó más. Además, para más información :h :s%, especialmente el último párrafo. (vía :h :s)
dipnlik
114

Otro aspecto de esto es que \0, que tradicionalmente es NULL, se s//\0/entiende como "todo el patrón coincidente". (Que, por cierto, es redundante y más largo que &).

  • Entonces no puedes \0decirNULL , entonces usas\n
  • Así que no puedes usar \npara decir \n, así que usas \r.
  • Por lo tanto, no puede \rsignificar \r, pero no sé quién querría agregar ese personaje a propósito.

—☈

rking
fuente
1
¡Buen punto! Entonces, este es un truco alrededor de \ 0 - referencia al grupo anidado 0 - regexp completo. Esta es una muy buena respuesta, pero me decepciona que no pueda usar \ r en reemplazo ... (es decir: inserte # (13), por ejemplo, en un archivo "normal" (== EOL unix).
Tomasz Gandor
3
OK, la respuesta está en los documentos de Vim. Simplemente escape \ ^ M o \ <CR>, con una barra invertida normal. Agradable. ----- <CR> línea dividida en dos en este punto (Escriba <CR> como CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> inserte un retorno de carro (CTRL-M) (Escriba <CR> como CTRL-V <Enter>) s / \ <CR>
Tomasz Gandor
16
"Otro aspecto"? Eres demasiado modesto! Al explicar con precisión_por qué sucede esto, se obtiene una respuesta superior a todas las que solo dicen cómo solucionarlo. +1
underscore_d
Honestamente, esta es una gran idea de por qué \ntiene diferentes significados en los patrones de búsqueda y reemplazo. Fantástica respuesta.
ZeroKnight
47

:help NL-used-for-Nul

Detalle técnico:

<Nul>Los caracteres del archivo se almacenan como <NL>en la memoria. En la pantalla se muestran como " ^@". La traducción se realiza al leer y escribir archivos. Para que coincida <Nul>con un patrón de búsqueda, simplemente ingrese CTRL- @ o " CTRL-V 000". Esto es probablemente lo que esperas. Internamente, el carácter se reemplaza con un <NL>en el patrón de búsqueda. Lo que es inusual es que escribir CTRL-V CTRL-J también inserta un <NL>, por lo tanto, también busca un <Nul> en el archivo. {Vi no puede manejar <Nul>caracteres en el archivo en absoluto}


Aristóteles Pagaltzis
fuente
10

En primer lugar, abra :h :spara ver la sección "4.2 Sustituto" de la documentación sobre "Cambio". Esto es lo que acepta el comando:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Observe la descripción sobre patternystring

Por el {pattern}ver |pattern|.
{string}puede ser una cadena literal o algo
especial; ver |sub-replace-special|.

Entonces, ahora sabe que el patrón de búsqueda y los patrones de reemplazo siguen reglas diferentes. Si sigue el enlace a |pattern|, lo lleva a la sección que explica todos los patrones de expresiones regulares utilizados en Vim.

Mientras tanto, lo |sub-replace-special|lleva a la subsección de "4.2 Sustituto", que contiene los patrones para la sustitución, entre los cuales se encuentra el \rsalto de línea / división.

(El acceso directo a esta parte del manual es :h :s%)

syockit
fuente