Buscar y reemplazar caracteres de control (^ @, ^ M, ^ I ...) en vi

14

Copié esta línea desde /proc/some_proc_id/cmdlinemi máquina ubuntu,

java^@-jar^@/usr/lib/selenium/selenium-server-standalone.jar^@-port^@4444^@-trustAllSSLCertificates^@

De alguna manera, los caracteres del espacio están representados ^@en vi. Traté de reemplazarlos con caracteres de espacio usando el comando,

:%s#^@# #g

Pero dice, pattern not found ^@.

¿Cómo se pueden reemplazar los caracteres especiales, particularmente aquellos que comienzan con el símbolo en quilates?

Gilles 'SO- deja de ser malvado'
fuente
¿Cuál es el tipo de terminal que está utilizando?
Ed Heal
a veces, TERMy muchas veces, esscreen
¿Cuál es el programa de terminal que está utilizando y la TERMvariable de entorno está configurada correctamente?
Ed Heal

Respuestas:

15

De alguna manera, los caracteres del espacio están representados ^@en vi.

No es vieso lo que hizo. Aunque escriba líneas de comando en shells con espacios entre los argumentos, las líneas de comando son en realidad secuencias discretas de cadenas internamente, no una cadena larga separada por espacios. El shell separó la línea de comandos en cadenas de argumentos individuales antes de que se iniciara el comando.

En C, las cadenas se terminan con caracteres NUL y se muestran como ^@.

¿Cómo se pueden reemplazar los caracteres especiales, particularmente aquellos que comienzan con el símbolo en quilates?

Para escribir esos caracteres, debe prefijarlos con Control- vpara el siguiente carácter literal.

Por ejemplo en este caso: Control- vseguido de Control- @.

El carácter especial que introduce los siguientes caracteres literales es normalmente Control, vpero en realidad es configurable. Escriba stty -apara averiguar en qué está configurado. Busque lnexten la salida.

Celada
fuente
la publicación es informativa ... pero la verdadera solución para mi pregunta es escapar del símbolo en quilates - :%s#^@##g. Desde que copio, pegado desde la terminal, vi los ha pegado como caracteres originales ...
1
@MadhavanKumar No escapar del símbolo de intercalación, porque no es ningún símbolo de intercalación. Es realmente un personaje de control real. ^letteres solo una notación visual para eso, no hay preocupación real involucrada. Y sí, tienes que escapar del carácter de control, Ctrl-V es cómo lo haces desde el teclado. Eso funciona casi en todas partes. Para su información, la otra respuesta contiene una alternativa, específica de vila línea de comando, para evitar tener que escribir el carácter de control.
Celada
@MadhavanKumar Si su terminal muestra los caracteres NUL como la cadena de dos caracteres ^@y copió y pegó eso, entonces use \^@para representar esa cadena de dos caracteres en vi. Una gran cantidad de software utiliza la barra invertida para significar "interpretar el siguiente carácter literalmente en lugar de usar su función especial".
Gilles 'SO- deja de ser malvado'
@Gilles, tienes razón ... eso es lo que traté de transmitir a Celada ...
4

Ese símbolo representa un carácter NULO, con valor ASCII 000.

Tu podrías intentar:

:%s/\%x00/ /g

Alternativa:

En un teclado donde el símbolo @ está encima de la 2tecla (gracias Celada) puedes hacer:

  • %s/<CTRL-2>/ /g (en PC)

  • %s/<CTRL-SHIFT-2>/ /g (en Mac)

donde <CTRL-2>significa presionar primero la CTRLPC, manteniéndola presionada, presionar 2, soltar CTRL.

y <CTRL-SHIFT-2>significa primero presionar hacia abajo controlen Mac, manteniéndolo presionado, presionar hacia abajo shiften Mac, mantenerlo presionado, presionar 2, soltar controly shift.

Finalmente, los dos comandos deberían aparecer en la %s/^@/ /gpantalla. ^@significa un solo carácter, no ^seguido de @, por lo que no puede simplemente escribir ^y @en una fila en el comando anterior.

Este comando reemplaza todo ^@con caracteres de espacio.

( Fuente )

erik
fuente
Cuando dices "PC", ¿te refieres a Windows?
Sparhawk
1
CTRL-2 y CTRL-SHIFT-2 solo tienen sentido en los diseños de teclado donde @está encima de la 2tecla.
Celada
@Sparhawk: No, me refiero a una PC Linux. :-)
erik
¿Por qué CTRL? Nunca he visto un sistema donde CTRL es la clave utilizada para cambiar entre el significado diferente de una clave. Eso normalmente es SHIFT.
terdon
Es extraño (¿tal vez un error en vim?), Pero funciona. Por lo general, debería ser ctrl + shift + 2 (en un teclado us). Pregúntelo como una pregunta separada o pregunte a los desarrolladores de vim. De todos modos, la respuesta de Celada es más general para los personajes de control.
erik