occurrences - vim replace visual selection




¿Cómo reemplazar un personaje por una nueva línea en Vim? (8)

Utilice \r lugar de \n .

La sustitución por \n inserta un carácter nulo en el texto. Para obtener una nueva línea, utilice \r . Sin embargo, al buscar una nueva línea, seguirías usando \n . Esta asimetría se debe al hecho de que \n \r hacen 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 comandos Vim (en otras palabras, puede copiar y pegar lo siguiente en un 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; Ha insertado el byte 0x0a.

Estoy tratando de reemplazar cada uno , en el archivo actual por una nueva línea:

:%s/,/\n/g 

Pero inserta lo que parece un ^@ 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 newline para Vim? también.


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 carácter ^M , escriba Control - v y presione Enter . Bajo Windows, haga Control - q , Entrar . La única forma en que puedo recordar esto es recordando lo poco sentido que tienen:

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

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

A: Hazlo así.


Con Vim en Windows use Ctrl + Q en lugar de Ctrl + V


Creo que esta es la mejor respuesta, pero hubiera sido mejor en una tabla: https://.com/a/12389839/962394 .

Entonces, reescribiendo:

0x0a usar \r para usar un salto de línea (ascii 0x0a , la nueva línea de unix) en un reemplazo de 0x0a , pero eso es propio del reemplazo. Normalmente, debe continuar usando \n para el salto de línea y \r para el retorno de carro .

Esto se debe a que vim utilizó \n en un reemplazo para indicar el carácter NIL (ascii 0x00 ). Es posible que haya esperado que NIL haya sido \0 , liberando \n para su uso habitual para el salto 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, yendo más allá también para cambiar la nueva línea de \n a \r (que en un patrón de 0x0d 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>

NB: ^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 lo han aconsejado (simplemente lo probé).

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


En la sintaxis s/foo/bar \r y \n tienen diferentes significados, según el contexto.

corto:

Para foo :
\ n = nueva línea (LF en linux / mac, CRLF en Windows)
\ r = retorno de carro (CR)

Para bar :
\ r = es nueva linea
\ n = byte nulo.

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

NUL = 0x00 = 0 = CTRL @
LF = 0x0A = 10 = CTRL J
CR = 0x0D = 13 = CTRL M

Aquí hay una lista de los caracteres de control ASCII , insértelos en vim través de CTRL v CTRL --- tecla --- .
En bash o en otros shells de unix / linux simplemente teclee CTRL --- key --- . Pruebe CTRL M en bash, es lo mismo que presionar ENTER , ya que el shell se da cuenta de lo que se quiere decir, a pesar de que los sistemas linux usan Line Feeds para delimitar líneas.

Para insertar literales en bash, también funcionará el antepuesto con CTRL v .

Prueba en bash:

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

Esto utiliza secuencias de escape ANSI , inserte los dos ^[ 's a través de CTRL v ESC .

También puede probar CTRL v CTRL m ENTER , que le dará esto:

bash: $'\r': command not found

¿Recuerdas los 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 tecla CTRL (jaja), pueden encontrarse allí. Mientras que en C y en la mayoría de los otros idiomas, usualmente usas los 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á sobre este tema, pero tenga cuidado: hay dragones.

TL; DR

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


Necesitas usar

:%s/,/^M/g

Para obtener el carácter ^M , presione Ctrl v seguido de Entrar


Puedes hacer el trabajo aquí por ti.


Si necesita hacer para un archivo completo, también se me sugirió que podría probar desde la línea de comandos

sed 's/\\n/\n/g' file > newfile




vi