Pregunta

Estoy tratando de reemplazar cada uno , 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.

¿Qué tengo que hacer?

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

¿Fue útil?

Solución

Usar \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 a 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 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 <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). 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.

Otros consejos

Aquí está 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 Control-v y golpear Ingresar.En Windows, haga Control-q, Ingresar.La única forma en que puedo recordarlos es recordando el poco sentido que tienen:

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

B: Cualquiera q (porque normalmente significa "Salir") o v porque sería muy fácil escribir Control-C por error y matar al editor.

A: Hazlo así.

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


corto:

Para foo:
= nueva línea (LF en Linux/Mac, CRLF en Windows)
= retorno de carro (CR)

Para bar:
= es nueva línea
= byte nulo.

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

NUL = 0x00 = 0 = CONTROL@
LF = 0x0A = 10 = CONTROLj
CR = 0x0D = 13 = CONTROLMETRO

Aquí hay una lista de los Caracteres de control ASCII, insértelos en vim a través de CONTROLvCONTROL---llave---.
En bash o los otros shells de Unix/Linux simplemente escriben CONTROL---llave---.Intentar CONTROLMETRO en bash, es lo mismo que golpear INGRESAR, ya que el shell se da cuenta de lo que se quiere decir, aunque los sistemas Linux usan Line Feeds para delimitar líneas.

Para insertar literales en bash, anteponiéndolos con CONTROLv también funcionará.

Prueba en bash:

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

Esto usa Secuencias de escape ANSI, inserte los dos ^[es vía CONTROLvESC.

También puedes intentar CONTROLvCONTROLmetroINGRESAR, que te dará esto:

bash: $'\r': command not found

Recuerda el \r ¿desde arriba?:>

Este Caracteres de control ASCII la lista es diferente de una completa tabla de símbolos ASCII, en el sentido de que los caracteres de control, que se insertan en una consola/pseudoterminal/vim a través del CONTROL clave (jaja), se puede 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: http://www.linusakesson.net/programming/tty/.
Este es el mejor enlace que encontrarás sobre este tema, pero ojo:Habrá dragones.


TL;DR

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

Necesitas usar

:%s/,/^M/g

Para obtener el ^M personaje, presione Control v seguido por Ingresar

\r puede hacer el trabajo aquí por usted.

Con Vim en uso de Windows Control+q en lugar de Control+V

Esta es la mejor respuesta según mi forma de pensar, pero hubiera sido mejor en una tabla: https://stackoverflow.com/a/12389839/962394.

Entonces, reformulando:

Necesitas usar \r utilizar un avance de línea (ascii) 0x0a, la nueva línea de Unix) en un reemplazo de expresiones regulares, pero eso es peculiar del reemplazo; normalmente deberías seguir esperando usar \n para avance de línea y \r para retorno de carro.

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

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NÓTESE BIEN: ^M (Ctrl-V Ctrl-M en Linux) inserta una nueva línea cuando se usa en un reemplazo de expresiones regulares en lugar de un retorno de carro como otros han recomendado (lo acabo de probar).

También tenga en cuenta que vim traducirá el carácter de avance de línea cuando lo guarde en un archivo según su configuración de formato de archivo y eso podría confundir las cosas.

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

:s/\r/\r/g

Pero si uno tiene que sustituirlo, entonces lo siguiente funciona.

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

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

line1
line2
line3

se cambia a

line1
|-
line2
|-
line3

Si necesita hacerlo con un archivo completo, también me sugirieron 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 tengo que hacer y no puedo recordarlo 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/reemplazar_with^m/g El comando anterior reemplazaría todas las instancias de "apartar_for" con "reemplazar_with n" (con n significa nueva línea)

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


Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top