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
\r
lugar de\n
.Sustituyendo 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, aún la usaría\n
. 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 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, utilizando la función de línea de comando Vim (en otras palabras, puede copiar y pegar lo siguiente en un terminal para ejecutarlo).xxd
muestra un hexdump del archivo resultante.En otras palabras,
\n
ha insertado el byte 0x00 en el texto;\r
ha insertado el byte 0x0a.fuente
\r
no funciona así. Pero puede presionarCtrl-V
Enter
en lugar de escribir\r
, y funciona.\r
inserta<CR>
e\n
inserta 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
^M
personaje, 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-v
seguido de enter crea el^M
personaje para mí muy bien.Ctrl-C
en realidad no mata al editor, aunque puede cancelar su regreso al modo Normal.Ctrl-V
significa textualmente yCtrl-Q
significa que alguien cometió el error de cargar el$VIMRUNTIME/mswin.vim
archivo de configuración. No necesitas mswin. Simplemente use su propio vimrc en su lugar.sed -n l
hasta ahora. Es bueno saber que se puede lograr lo mismo conCtrl-v
in vim.En la sintaxis
s/foo/bar
,\r
y\n
tienen 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
\r
de 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/g
debería hacer. Inserte la^M
víactrl-v
seguida dectrl-m
.Necesitas usar:
Para obtener el
^M
personaje, presione Ctrl+ vseguido de Enter.fuente
\r
Puede 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
\r
para 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\n
para el avance de línea y el\r
retorno de carro.Esto se debe a que Vim se usó
\n
en un reemplazo para referirse al carácter NIL (ASCII0x00
). Es posible que haya esperado que NIL haya estado en su\0
lugar, liberando\n
para su uso habitual para el 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 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
^M
caracteres 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