Cómo reemplazar un carácter por una nueva línea en Vim
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.
Usar \r
en lugar de \n
.
Al sustituir por \n
se 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 \n
y \r
hacemos 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
se inserta un carácter nulo mientras que \r
se 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.
Es decir, \n
ha insertado el byte 0x00 en el texto; \r
ha insertado el byte 0x0a.
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 ^M
personaje, 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") ov
porque sería muy fácil escribir Ctrl+ Cpor error y cerrar el editor.R: Hazlo así.
En la sintaxis s/foo/bar
, \r
y \n
tienen 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 CRLF
en Windows
Para bar
:
\r
== produce LF
en Linux/Mac, CRLF
en 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 ^M
ve en vim son CR
archivos 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== ^M
se 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 \r
de 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
= \n
y bar
= \r
.
\r
puede hacer el trabajo aquí por usted.