Cómo sustituir un carácter por una nueva línea en Vim

Estoy tratando de reemplazar cada , en el archivo actual por una nueva línea:

:%s/,/\n/g 

Pero inserta lo que parece un ^@ en lugar de una nueva línea real. El archivo no está en modo DOS ni nada por el estilo.

¿Qué debo hacer?

Si tienes curiosidad, como yo, revisa también la pregunta ¿Por qué \r es una nueva línea para Vim?.

Solución

Use \r en lugar de \n.

La sustitución por \n inserta un carácter nulo en el texto. Para obtener una nueva línea, utilice \r. Sin embargo, al buscar una nueva línea, se debe usar n. Esta asimetría se debe al hecho de que "n" y "r" [hacen cosas ligeramente diferentes] (http://vim.wikia.com/wiki/Search_and_replace):

\n coincide con un final de línea (nueva línea), mientras que \r coincide con un retorno de carro. Por otra parte, en las sustituciones \n inserta un carácter nulo mientras que \r inserta una nueva línea (más precisamente, se trata como la entrada ). He aquí un pequeño ejemplo no interactivo para ilustrar esto, utilizando la función de línea de comandos de Vim (en otras palabras, puedes copiar y pegar lo siguiente en un terminal para ejecutarlo). xxd muestra un volcado hexadecimal del archivo resultante.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

En otras palabras, \n ha insertado el byte 0x00 en el texto; \r ha insertado el byte 0x0a.

Comentarios (16)

Es necesario utilizar

:%s/,/^M/g

Para obtener el carácter ^M, pulse Ctrl v seguido de Enter.

Comentarios (1)

r puede hacer el trabajo aquí por ti.

Comentarios (0)