Estoy tratando de 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 real. El archivo no está en modo DOS ni nada.
¿Qué tengo que hacer?
Si tiene curiosidad, como yo, consulte la pregunta ¿Por qué es \ ra nueva línea para Vim? también.

Respuestas:
Usar en
\rlugar de\n.Sustituyendo por
\ninserta un carácter nulo en el texto. Para obtener una nueva línea, use\r. Sin embargo, cuando busque una nueva línea, aún la usaría\n. Esta asimetría se debe al hecho de que\ny\rhacer 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\ninserta un carácter nulo mientras que\rinserta 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 comando Vim (en otras palabras, puede copiar y pegar lo siguiente en un terminal para ejecutarlo).xxdmuestra un hexdump del archivo resultante.En otras palabras,
\nha insertado el byte 0x00 en el texto;\rha insertado el byte 0x0a.fuente
\rno funciona así. Pero puede presionarCtrl-VEnteren lugar de escribir\r, y funciona.\rinserta<CR>e\ninserta un valor nulo, ¿cómo reemplazaría algo con un retorno de carro?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:
A continuación, haz:
Para obtener el
^Mpersonaje, escribe Ctrl+ Vy presiona Enter. Bajo Windows, hacer Ctrl+ Q, Enter. La única forma en que puedo recordar esto es recordando el poco sentido que tienen:fuente
:set magic(tampoco está en mi ~ / _vimrc) nictrl-q. Solo un simplectrl-vseguido de enter crea el^Mpersonaje para mí muy bien.Ctrl-Cen realidad no mata al editor, aunque puede cancelar su regreso al modo Normal.Ctrl-Vsignifica textualmente yCtrl-Qsignifica que alguien cometió el error de cargar el$VIMRUNTIME/mswin.vimarchivo de configuración. No necesitas mswin. Simplemente use su propio vimrc en su lugar.sed -n lhasta ahora. Es bueno saber que se puede lograr lo mismo conCtrl-vin vim.En la sintaxis
s/foo/bar,\ry\ntienen diferentes significados, dependiendo del contexto.Corto:
Para
foo:\ n = nueva línea (LF en Linux / Mac, CR + LF en Windows)
\ r = retorno de carro (CR)
Para
bar:\ r = es nueva línea
\ n = byte nulo.
Más largo (con números ASCII):
NUL= 0x00 = 0 = Ctrl+ @LF= 0x0A = 10 = Ctrl+ JCR= 0x0D = 13 = Ctrl+MAquí 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---.
Prueba Ctrl+ Men Bash. Es lo mismo que golpear Enter, ya que el shell se da cuenta de lo que significa, a pesar de que los sistemas Linux usan avances de línea para delimitar la línea.
Para insertar literales en bash, anteponerlos con Ctrl+ Vtambién funcionará.
Probar en Bash:
Esto usa secuencias de escape ANSI . Inserte los dos
^['S a través Ctrl+ V, Esc.También puede intentar Ctrl+ V, Ctrl+ M, Enterque será administrado por:
¿Recuerdas lo
\rde arriba? :>Esta lista de caracteres de control ASCII es diferente de una tabla de símbolos ASCII completa , ya que los caracteres de control, que se insertan en una consola / pseudoterminal / Vim a través de la Ctrltecla (jaja), se pueden encontrar allí.
Mientras que en C y en la mayoría de los otros lenguajes, usualmente usas los 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á sobre este tema, pero tenga cuidado: habrá dragones.
TL; DR
Usualmente
foo=\n, ybar=\r.fuente
:s/x/^M/gdebería hacer. Inserte la^Mvíactrl-vseguida dectrl-m.Necesitas usar:
Para obtener el
^Mpersonaje, presione Ctrl+ vseguido de Enter.fuente
\rPuede hacer el trabajo aquí por usted.fuente
Con Vim en Windows, use Ctrl+ Qen lugar de Ctrl+ V.
fuente
Esta es la mejor respuesta para mi forma de pensar, pero hubiera sido mejor en una tabla:
¿Por qué es \ ra nueva línea para Vim?
Entonces, reformulación:
Debe usar
\rpara usar un avance de línea (ASCII0x0A, la nueva línea de Unix) en un reemplazo de expresiones regulares, pero eso es peculiar del reemplazo; normalmente debe seguir esperando usarlo\npara el avance de línea y el\rretorno de carro.Esto se debe a que Vim se usó
\nen un reemplazo para referirse al carácter NIL (ASCII0x00). Es posible que haya esperado que NIL haya estado en su\0lugar, liberando\npara su uso habitual para el avance de línea, pero\0ya 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\na\r(que en un patrón regex es el carácter de retorno de carro, ASCII0x0D).NB:
^M( Ctrl+ V Ctrl+ Men 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 aconsejado (solo lo intenté).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.
fuente
Desde Eclipse , los
^Mcaracteres se pueden incrustar en una línea y desea convertirlos en nuevas líneas.fuente
Pero si uno tiene que sustituir, entonces lo siguiente funciona:
En lo anterior, cada línea siguiente se sustituye por la línea siguiente, y luego
|-y nuevamente una nueva línea. Esto se usa en tablas wiki.Si el texto es el siguiente:
Se cambia a
fuente
Si necesita hacerlo para un archivo completo, también me sugirió que lo intentara desde la línea de comandos:
fuente
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'ver si funcionará en su sistema. (Gracias a la buena gente de #bash en freenode por esta sugerencia).Aquí está la respuesta que me funcionó. De este chico:
---- citando Use el editor vi para insertar un carácter de nueva línea en reemplazar
Algo más que tengo que hacer y 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 reemplazar, haga lo siguiente:
El comando anterior reemplazaría todas las instancias de "look_for" con "replace_with \ n" (con \ n significa nueva línea).
Para obtener la "^ M", ingrese la combinación de teclas Ctrl+ V, y luego (suelte todas las teclas) presione la Entertecla.
fuente