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

Resuelto Vinko Vrsalovic asked hace 16 años • 12 respuestas

Estoy intentando reemplazar cada uno ,en el archivo actual por una nueva línea:

:%s/,/\n/g 

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

¿Qué tengo que hacer?

Si tiene curiosidad, como yo, consulte la pregunta ¿ Por qué hay una nueva línea para Vim? también.

Vinko Vrsalovic avatar Sep 16 '08 18:09 Vinko Vrsalovic
Aceptado

Usar \ren lugar de \n.

Al sustituir por \nse inserta un carácter nulo en el texto. Para obtener una nueva línea, use \r. Sin embargo, cuando busques una nueva línea, seguirás usando \n. Esta asimetría se debe al hecho de que \ny \r hacemos cosas ligeramente diferentes :

\ncoincide con un final de línea (nueva línea), mientras que \rcoincide con un retorno de carro. Por otro lado, en las sustituciones \nse inserta un carácter nulo mientras que \rse 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, usando la función de línea de comando de Vim (en otras palabras, puede copiar y pegar lo siguiente en una terminal para ejecutarlo). xxdmuestra 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.

Es decir, \nha insertado el byte 0x00 en el texto; \rha insertado el byte 0x0a.

Konrad Rudolph avatar Sep 16 '2008 11:09 Konrad Rudolph

Aquí está el truco:

Primero, configure su sesión de 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 ^Mpersonaje, escribe Ctrl+ Vy presiona Enter. En Windows, haga Ctrl+ Q, Enter. La única forma en que puedo recordarlos es recordando el poco sentido que tienen:

R: ¿ Cuál sería el peor carácter de control para representar una nueva línea?

B: Ya sea q(porque normalmente significa "Salir") o vporque sería muy fácil escribir Ctrl+ Cpor error y cerrar el editor.

R: Hazlo así.

Logan avatar Sep 25 '2008 23:09 Logan

En la sintaxis s/foo/bar, \ry \ntienen diferentes significados, según el contexto.


Corto:

Para foo:

\r== "retorno de carro" ( CR/ ^M)
\n== coincide con "avance de línea" ( LF) en Linux/Mac y CRLFen Windows

Para bar:

\r== produce LFen Linux/Mac, CRLFen Windows
\n== "byte nulo" ( NUL/ ^@)

Al editar archivos en Linux (es decir, en un servidor web) que se crearon inicialmente en un entorno de Windows y se cargaron (es decir, FTP/SFTP), todos los archivos que ^Mve en vim son CRarchivos que Linux no traduce ya que solo usa LF's para representar un salto de línea.


Más largo (con números ASCII):

NUL== 0x00 == 0 == Ctrl+ @== ^@se muestra en vim
LF== 0x0A == 10 == Ctrl+ J
CR== 0x0D == 13 == Ctrl+ M== ^Mse muestra en vim

Aquí hay una lista de los caracteres de control ASCII . Insértelos en Vim a través de Ctrl+ V, Ctrl+ ---key---.

En Bash u otros shells de Unix/Linux, simplemente escriba Ctrl+ ---key---.

Pruebe Ctrl+ Men Bash. Es lo mismo que presionar Enter, ya que el shell se da cuenta de lo que se quiere decir, aunque los sistemas Linux usan avances de línea para delimitar líneas.

Para insertar literales en bash, anteponerles Ctrl+ Vtambién funcionará.

Pruebe en Bash:

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

Esto utiliza secuencias de escape ANSI . Inserte los dos ^[a través de Ctrl+ V, Esc.

También puedes probar Ctrl+ V, Ctrl+ M, Enter, que te dará esto:

bash: $'\r': command not found

¿ Recuerdas lo \rde arriba? :>

Esta lista de caracteres de control ASCII se diferencia de una tabla de símbolos ASCII completa en que los caracteres de control, que se insertan en una consola/pseudoterminal/Vim mediante la Ctrltecla (jaja), se pueden encontrar allí.

Mientras que en C y en la mayoría de los demás lenguajes, normalmente se utilizan códigos octales para representar estos "caracteres".

Si realmente quieres saber de dónde viene todo esto: El TTY desmitificado . Este es el mejor enlace que encontrarás sobre este tema, pero cuidado: hay dragones.


TL;DR

Generalmente foo= \ny bar= \r.

sjas avatar Sep 23 '2013 14:09 sjas

\rpuede hacer el trabajo aquí por usted.

Lasar avatar Sep 16 '2008 11:09 Lasar