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?
vim
regular-expression
vi-mode
Raghvendra
fuente
fuente
/
como separador. Esto es más legible::%s;\n;\n\n;g
\n
, reemplazar con\r\r
,:% s/\n/\r\r/g
: stackoverflow.com/a/71334/911945Respuestas:
Por extraño que parezca,
\n
en 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\n
significado sea nulo al reemplazar el texto. Esto es inconsistente con su uso en búsquedas , que encuentran una nueva línea.Otras lecturas:
fuente
Pruebe esto:
%s/$/^V^M/
(donde^V
estáCtrl-V
y^M
estáCtrl-M
- cuando escribe^V
imprimirá un^
carácter y luego retrocederá sobre él y luego cuando escriba el^M
aparecerá como^M
... el Ctrl-V es el siguiente carácter literal literal tty - ejecute el comandostty -a
para muestra los caracteres especiales de tu tty).fuente
vim
se utiliza\n
para representar un carácter nulo\0
en la memoria, es decir, cómovim
manejar el archivo contiene un carácter nulo (mientrasvi
que no puede).El uso de
\n
solo 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.
fuente
Probado con Neovim (
nvim
) yVim
versionesEliminar una nueva línea:
Aquí,
\n
coincide con las nuevas líneas ( sin embargo, para insertar una nueva línea, use\r
):Añadir una nueva línea:
No:
^@
es una marca diacrítica para LF (avance de línea; ver http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )Sí:
Para abordar la pregunta del OP (cómo reemplazar uno
\n
con dos\n\n
), simplemente agregue otro\r
:... es decir, hacer coincidir la nueva línea original (
\n
) y reemplazarla con dos nuevas líneas / retornos de carro (\r\r
).fuente