El tutorial o código que encontrarás en este post es la solución más sencilla y válida que encontramos a tus dudas o problema.
Solución:
Utilizar r
en lugar de n
.
Sustituyendo por n
inserta un null personaje en el texto. Para obtener una nueva línea, use r
. Cuándo 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 el contrario, en sustituciones n
inserta un null personaje mientras que r
inserta una nueva línea (más precisamente, se trata como la entrada RC). Aquí hay un pequeño ejemplo no interactivo para ilustrar esto, usando la función de línea de comandos 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.
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
tipo de caracter control + V y golpear Ingresar. En Windows, haga control + q, Ingresar. La única forma en que puedo recordar esto 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 generalmente significa “Salir”) ov
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.
Pequeño:
Para foo
:
r
== “retorno de carro” (CR
/ ^M
)n
== coincide con “salto de línea” (LF
) en Linux/Mac, y CRLF
en Windows
Para bar
:
r
== produce LF
en Linux/Mac, CRLF
en Windowsn
== “null byte” (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 ^M
‘s que ves en vim, son los CR
‘s 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 == control + @ == ^@
mostrado en vimLF
== 0x0A == 10 == control + jCR
== 0x0D == 13 == control + METRO == ^M
mostrado en vim
Aquí hay una lista de los caracteres de control ASCII. Insértelos en Vim a través de control + V,control + ---key---.
En Bash o en los otros shells de Unix/Linux, simplemente escriba control + ---key---.
Tratar control + METRO en bash. es lo mismo que golpear Ingresarya que el shell se da cuenta de lo que significa, aunque los sistemas Linux usan saltos de línea para delimitar líneas.
Para insertar literales en bash, anteponiéndolos con control + V también funcionará.
Prueba en Bash:
echo ^[[33;1mcolored.^[[0mnot colored.
Esto usa secuencias de escape ANSI. Inserta los dos ^[
es vía control + V, Esc.
También puedes intentar control + V,control + METRO, Ingresarque te dará esto:
bash: $'r': command not found
Recuerda el r
¿desde arriba? :>
Esta lista de caracteres de control ASCII es diferente de una tabla de símbolos ASCII completa, en que los caracteres de control, que se insertan en una consola/pseudoterminal/Vim a través del control key (jaja), se puede encontrar allí.
Mientras que en C y en la mayoría de los otros lenguajes, generalmente usa 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ás sobre este tema, pero cuidado: hay dragones.
TL;DR
Generalmente foo
= n
y bar
= r
.
Ten en cuenta dar difusión a este ensayo si lograste el éxito.