Pregunta ¿Cómo reemplazar un personaje 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.

¿Que debería hacer?

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


1587
2017-09-16 11:19


origen


Respuestas:


Utilizar \r en lugar de \n.

Sustituyendo por \n inserta un carácter nulo en el texto. Para obtener una nueva línea, use \r. Cuando buscando para una nueva línea, todavía usarías \n, sin embargo. Esta asimetría se debe al hecho de que \n y \r  hacer cosas ligeramente diferentes:

\n coincide con un final de línea (nueva línea), mientras que \r coincide con un retorno de carro. Por otro lado, en sustituciones \n inserta un carácter nulo mientras que \r inserta una nueva línea (más precisamente, se trata como la entrada <CR>) Aquí hay un pequeño ejemplo no interactivo para ilustrar esto, utilizando la función de línea de comandos de Vim (en otras palabras, puede copiar y pegar lo siguiente en un terminal para ejecutarlo). xxd muestra un hexdump 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.


2074
2017-09-16 11:21



Este es el truco:

Primero, configure su sesión vi (m) para permitir la coincidencia de patrones con caracteres especiales (es decir, nueva línea). Probablemente valga la pena poner esta línea en su archivo .vimrc o .exrc.

:set magic

A continuación, haz:

:s/,/,^M/g

Para obtener el ^M tipo de caracter Controlar-v y golpear Entrar. En Windows, hazlo Controlar-q, Entrar. La única manera en que puedo recordar esto es recordando cuán poco sentido tienen:

UN: ¿Cuál sería el peor personaje de control para representar una nueva línea?

SEGUNDO: Ya sea q (porque generalmente significa "Salir") o v porque sería tan fácil escribir Controlar-do por error y matar al editor.

UN: Hazlo así.


166
2017-09-25 23:40



En la sintaxis s/foo/bar  \r y \n tienen diferentes significados, dependiendo del contexto.


por foo:
\ n = newline
\ r = CR (retorno de carro = Ctrl-M = ^ M)

por bar:
\ r = es nueva línea
\ n = byte nulo (0x00).


He visto preguntas sobre estas cosas con bastante frecuencia en el pasado, y en algún momento en el futuro casi nadie sabrá nada sobre estas cosas con el tiempo ...

Por solicitud 'popular':

Aquí hay una lista de Caracteres de control ASCII, insértelos en vim vía CTRLvCTRL---llave---.
En bash o las otras conchas de Unix / Linux simplemente escriben CTRL---llave---. Tratar CTRLMETRO en bash, es lo mismo que golpear ENTRAR, ya que el shell se da cuenta de lo que se entiende, aunque los sistemas linux usan Line Feeds para delimitar líneas. Solo el mensaje de control para Line Feed es CTRL-A, que está destinado a "saltar al comienzo de la línea" en bash.

Para insertar literales en bash, CTRLv también funcionará

Prueba en bash:

echo ^[[33;1mcolored.^[[0mnot colored.

Esto usa Secuencias de escape ANSI, inserte los dos ^[es a través de CTRLvESC.

También puedes probar CTRLvCTRLmetroENTRAR, que te dará esto:

bash: $'\r': command not found

Recuerda el \r ¿desde arriba? :>

los Caracteres de control ASCII la lista es diferente del estándar tabla de símbolos ascii, en que los caracteres de control, que se insertan en una consola / pseudoterminal / vim a través del CTRL clave (jaja), se puede encontrar allí. Mientras que en C y en la mayoría de los otros idiomas usualmente usas los códigos octales para representar estos 'personajes'.

Si realmente quieres saber de dónde viene todo esto: http://www.linusakesson.net/programming/tty/.
Este es el mejor enlace que encontrarás sobre este tema, pero ten cuidado: hay dragones.


TL; DR

Generalmente foo = \ny bar = \r.


65
2017-09-23 14:00



Tienes que usar

:%s/,/^M/g

Para obtener el ^M personaje, prensa Ctrl  v seguido por Entrar


45
2017-09-16 11:30



\r puede hacer el trabajo aquí para ti.


27
2017-09-16 11:21



Con Vim en el uso de Windows Ctrl+Q en lugar de Ctrl+V


20
2017-09-16 11:45



Desde eclipse, el ^M los caracteres se pueden incrustar en una línea y desea convertirlos en líneas nuevas.

:s/\r/\r/g

8
2017-09-06 17:53