Vim: cómo reemplazar una nueva línea \ n con dos \ n


34

En vim editor, quiero reemplazar un carácter de nueva línea (\ n) con dos nuevos caracteres de línea (\ n \ n) usando el modo de comando vim.

Contenido del archivo de entrada:

This is my first line.
This is second line.

Comando que probé:

:%s/\n/\n\n/g

reemplaza la cadena con caracteres no deseados como

This is my first line.^@^@This is second line.^@^@

Entonces probé el siguiente comando

:%s/\n/\r\r/g

Funciona correctamente ¿Puedes explicar por qué funciona bien con el segundo comando?



2
FYI: También hay un SE Vi y Vim (beta) .
Dubu

2
Nota al margen, no tiene que usar /como separador. Esto es más legible::%s;\n;\n\n;g
DJMcMayhem

1
Buscar \n, reemplazar con \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Respuestas:


47

Por extraño que parezca, \nen vim para reemplazo no significa nueva línea, sino nula. ASCII nul es ^@( control@).

Históricamente, vi reemplaza ^M(controlM ) como el final de línea, que es la nueva línea. vim agregó una extensión \r(como el lenguaje C) para significar lo mismo que ^M, pero los desarrolladores optaron por hacer que el \nsignificado sea nulo al reemplazar el texto. Esto es inconsistente con su uso en búsquedas , que encuentran una nueva línea.

Otras lecturas:


7

Pruebe esto: %s/$/^V^M/(donde ^Vestá Ctrl-Vy ^Mestá Ctrl-M- cuando escribe ^Vimprimirá un ^carácter y luego retrocederá sobre él y luego cuando escriba el ^Maparecerá como ^M... el Ctrl-V es el siguiente carácter literal literal tty - ejecute el comando stty -apara muestra los caracteres especiales de tu tty).


De hecho, los muy experimentados sabrán esto para la conversión siempre requerida de CRLF como una alternativa al abandono y el uso de dos2unix o similar. El uso de Ctrl-V es una lección de día 1 vi.
mckenzm

5

vimse utiliza \npara representar un carácter nulo \0en la memoria, es decir, cómo vimmanejar el archivo contiene un carácter nulo (mientras vique no puede).

El uso de \nsolo coincide con el final de línea en el búfer, no la nueva línea en la cadena cuando se usa en expresión.

Consulte : h NL-used-for-Null y : h CR-used-for-NL para obtener más detalles.


1

Probado con Neovim ( nvim) y Vimversiones

NVIM v0.3.0
VIM - Vi IMproved 8.1

Eliminar una nueva línea:

cell
allele
rs2981578
fgfr2

Aquí, \ncoincide con las nuevas líneas ( sin embargo, para insertar una nueva línea, use \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Añadir una nueva línea:

No:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@ es una marca diacrítica para LF (avance de línea; ver http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )

Sí:

cell|allele|rs2981578|fgfr2

:'<,'>s/|/\r/g

cell
allele
rs2981578
fgfr2

Para abordar la pregunta del OP (cómo reemplazar uno \ncon dos \n\n), simplemente agregue otro \r:

cell
allele
rs2981578
fgfr2

:'<,'>s/\n/\r\r/g

cell

allele

rs2981578

fgfr2

... es decir, hacer coincidir la nueva línea original ( \n) y reemplazarla con dos nuevas líneas / retornos de carro ( \r\r).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.