Recherchez et remplacez les caractères de contrôle (^ @, ^ M, ^ I…) dans vi

14

J'ai copié cette ligne /proc/some_proc_id/cmdlinedans ma machine Ubuntu,

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

D'une manière ou d'une autre, les caractères d'espace sont représentés par ^@en vi. J'ai essayé de les remplacer par des caractères d'espace en utilisant la commande,

:%s#^@# #g

Mais il dit pattern not found ^@.

Comment remplacer les caractères spéciaux, en particulier ceux qui commencent par le symbole carat?

Gilles 'SO- arrête d'être méchant'
la source
Quel type de terminal utilisez-vous?
Ed Heal
parfois, TERMet souvent, c'estscreen
Quel est le programme terminal que vous utilisez et la TERMvariable d'environnement est-elle correctement définie?
Ed Heal

Réponses:

15

D'une manière ou d'une autre, les caractères d'espace sont représentés par ^@en vi.

Ce n'est pas viça qui a fait ça. Bien que vous tapiez des lignes de commande dans des shells avec des espaces entre les arguments, les lignes de commande sont en fait des séquences discrètes de chaînes en interne, pas une longue chaîne séparée par des espaces. Le shell a séparé la ligne de commande en chaînes d'arguments individuelles avant le lancement de la commande.

En C, les chaînes se terminent par des caractères NUL et ceux-ci sont représentés par ^@.

Comment remplacer les caractères spéciaux, en particulier ceux qui commencent par le symbole carat?

Pour saisir ces caractères, vous devez les préfixer avec Control- vpour le caractère littéral suivant.

Par exemple dans ce cas: Control- vsuivi de Control- @.

Le caractère spécial qui introduit les caractères littéraux suivants est normalement Control- vmais il est en fait configurable. Tapez stty -apour savoir à quoi il est configuré. Recherchez lnextdans la sortie.

Celada
la source
le message est informatif .. mais la vraie solution à ma question est d'échapper au symbole carat - :%s#^@##g. Depuis que je copie, collé depuis le terminal, vi les a collés en tant que caractères originaux ...
1
@MadhavanKumar Vous n'échappez pas au symbole caret, car il n'y a pas de symbole caret. C'est vraiment un personnage de contrôle réel. ^letterest juste une notation visuelle pour cela, aucun véritable curseur n'est impliqué. Et oui, vous devez échapper au caractère de contrôle, le Ctrl-V est la façon dont vous faites cela depuis le clavier. Cela fonctionne le plus partout. Pour info, l'autre réponse contient une alternative, spécifique à vila ligne de commande de, pour éviter d'avoir à taper le caractère de contrôle.
Celada
@MadhavanKumar Si votre terminal affiche les caractères NUL sous la forme d'une chaîne de deux caractères ^@et que vous les copiez-collez, utilisez-les \^@pour représenter cette chaîne de deux caractères dans vi. De nombreux logiciels utilisent la barre oblique inverse pour signifier «interpréter le caractère suivant littéralement au lieu d'utiliser sa fonction spéciale».
Gilles 'SO- arrête d'être méchant'
@Gilles, vous avez raison .. c'est ce que j'ai essayé de transmettre à Celada ....
4

Ce symbole représente un caractère NULL, avec la valeur ASCII 000.

Tu pourrais essayer:

:%s/\%x00/ /g

Alternative:

Sur un clavier où le symbole @ est au-dessus de la 2touche (merci Celada), vous pouvez faire:

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

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

<CTRL-2>signifie d'abord appuyer sur CTRLle PC, en le maintenant enfoncé, appuyer 2, relâcher CTRL.

et <CTRL-SHIFT-2>signifie d'abord appuyer sur controlle Mac, en le maintenant tel qu'il est enfoncé, appuyer sur shiftle Mac, en le maintenant enfoncé, appuyer 2, relâcher controlet shift.

Enfin, les deux commandes devraient %s/^@/ /gapparaître à l'écran. ^@signifie un seul caractère, non ^suivi par @, donc vous ne pouvez pas simplement taper ^et @dans une ligne dans la commande ci-dessus.

Cette commande remplace tous les ^@caractères d'espacement.

( Source )

erik
la source
Quand vous dites "PC", voulez-vous dire Windows?
Sparhawk
1
CTRL-2 et CTRL-SHIFT-2 n'ont de sens que sur les dispositions de clavier où se @trouve en haut de la 2touche.
Celada
@Sparhawk: Non, je veux dire un PC Linux. :-)
erik
Pourquoi CTRL? Je n'ai jamais vu de système où CTRL est la clé utilisée pour basculer entre les différentes significations d'une clé. C'est normalement SHIFT.
terdon
C'est étrange (peut-être un bug dans vim?), Mais ça marche. Il doit généralement être ctrl + shift + 2 (sur un clavier américain). Posez-la comme une question distincte ou posez-la aux développeurs de vim. Quoi qu'il en soit, la réponse de Celada est plus générale pour les personnages de contrôle.
erik