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?

Raghvendra
fuente
Ver también unix.stackexchange.com/a/206404
Stéphane Chazelas
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:

Thomas Dickey
fuente
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).

Murray Jensen
fuente
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.

Cuonglm
fuente
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).

Victoria Stuart
fuente