¿Cómo reemplazar un personaje por una nueva línea en Vim?

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

 :%s/,/\n/g 

Pero inserta lo que parece un ^@ 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 \ ra newline para Vim? también.

Use \r lugar de \n .

Sustituir por \n inserta un carácter nulo en el texto. Para obtener una nueva línea, use \r . Sin embargo, cuando busque una nueva línea, igual usaría \n . Esta asimetría se debe al hecho de que \n y \r hacen 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 ). 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; ha insertado el byte 0x0a.

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 carácter ^M , escriba Controlv y presione Enter . En Windows, haga Controlq , Enter . La única manera en que puedo recordar esto es recordando cuán poco sentido tienen:

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

B: O bien q (porque usualmente significa “Quit”) v porque sería muy fácil escribir Controlc por error y matar al editor.

A: Hazlo así.

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


corto:

Para foo :
\ n = newline (LF en linux / mac, CRLF en windows)
\ r = retorno de carro (CR)

Para la bar :
\ r = es nueva línea
\ n = byte nulo.

más tiempo: (con números ascii)

NUL = 0x00 = 0 = CTRL @
LF = 0x0A = 10 = CTRL J
CR = 0x0D = 13 = CTRL M

Aquí hay una lista de los caracteres de control ASCII , insértelos en vim través de CTRL v CTRL --- clave --- .
En bash o en las otras shells de unix / linux solo escriba CTRL --- key --- . Pruebe CTRL M in bash, es lo mismo que presionar ENTER , ya que el shell se da cuenta de lo que significa, aunque los sistemas linux usan Line Feeds para delimitación de línea.

Para insertar literal en bash, anteponerlos con CTRL v también funcionará.

Prueba en bash:

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

Esto usa secuencias de escape ANSI , inserte los dos ^[ s] a través de CTRL v ESC .

También puede probar CTRL v CTRL m ENTER , que le dará esto:

 bash: $'\r': command not found 

Recuerde el \r desde arriba? :>

Esta lista de caracteres de control ASCII es diferente de una tabla de símbolos ASCII completa, en la que los caracteres de control, que se insertan en una consola / pseudoterminal / vim mediante la tecla CTRL (jaja), se pueden 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

Usualmente foo = \n , y bar = \r .

Tienes que usar

 :%s/,/^M/g 

Para obtener el carácter ^M , presione Ctrl v seguido de Entrar

puede hacer el trabajo aquí para usted.

Con Vim en Windows, use Ctrl + Q en lugar de Ctrl + V

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

 :s/\r/\r/g 

Pero si uno tiene que sustituir entonces lo siguiente funciona

 :%s/\n/\r\|\-\r/g 

en lo anterior, cada línea siguiente se sustituye por la siguiente línea y luego | – y nuevamente la siguiente línea. Esto se usa en tablas wiki. si el texto es el siguiente:

 line1 line2 line3 

se cambia a

 line1 |- line2 |- line3 

Esta es la mejor respuesta por la forma en que pienso, pero hubiera sido mejor en una tabla: https://stackoverflow.com/a/12389839/962394 .

Entonces, volviendo a redactar:

Necesita usar \r para usar un avance de línea (ascii 0x0a , la nueva línea de Unix) en un reemplazo de 0x0a , pero eso es peculiar al reemplazo: normalmente debería continuar esperando usar \n para avance de línea y \r para retorno de carro .

Esto es porque vim usó \n en un reemplazo para significar el carácter NIL (ascii 0x00 ). Es posible que haya esperado que NIL haya sido \0 lugar, liberando \n su uso habitual para la alimentación de línea, pero \0 ya tiene un significado en las sustituciones de expresiones regulares, por lo que se cambió a \n . Por lo tanto, ir más allá también cambiará la nueva línea de \n a \r (que en un patrón de 0x0d regulares es el carácter de retorno de carro, ascii 0x0d ).

 personaje |  código ascii |  Representación C |  regex match |  reemplazo de regex
 ------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
 nil |  0x00 |  \ 0 |  \ 0 |  \norte
 alimentación de línea (línea nueva de Unix) |  0x0a |  \ n |  \ n |  \ r
 retorno de carro |  0x0d |  \ r |  \ r |  

NB: ^M (Ctrl-V Ctrl-M en Linux) inserta una nueva línea cuando se utiliza en un reemplazo de expresiones regulares en lugar de un retorno de carro como otros han aconsejado (simplemente lo probé).

También tenga en cuenta que vim traducirá el carácter de salto de línea cuando lo guarda en un archivo en función de su configuración de formato de archivo y eso puede confundir la situación.

Si necesita hacer un archivo completo, también se me sugirió que podría intentarlo desde la línea de comando

 sed 's/\\n/\n/g' file > newfile 

Aquí está la respuesta que funcionó para mí. De este chico

—- citando http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Algo más que tengo que hacer y que no puedo recordar y luego tengo que mirar hacia arriba.

En vi para insertar un carácter de nueva línea en una búsqueda y reemplazo, haga lo siguiente:

:% s / look_for / replace_with ^ M / g el comando anterior reemplazará todas las instancias de “look_for” con “replace_with \ n” (con \ n que significa nueva línea)

para obtener el “^ M”, ingrese la combinación de teclas “ctl-V” y luego de eso (suelte todas las teclas) presione la tecla “enter”.