Cerca e sostituisci i caratteri di controllo (^ @, ^ M, ^ I ...) in vi


14

Ho copiato questa riga dalla /proc/some_proc_id/cmdlinemia macchina Ubuntu,

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

In qualche modo, i caratteri dello spazio sono rappresentati da ^@in vi. Ho provato a sostituirli con caratteri spaziali usando il comando,

:%s#^@# #g

Ma si dice, pattern not found ^@.

Come si possono sostituire i caratteri speciali, in particolare quelli che iniziano con il simbolo di carati?


Qual è il tipo di terminale che stai usando?
Ed Heal,

a volte, TERMe molte volte, lo èscreen

Qual è il programma terminale che si sta utilizzando e la TERMvariabile d'ambiente è impostata correttamente?
Ed Heal,

Risposte:


15

In qualche modo, i caratteri dello spazio sono rappresentati da ^@in vi.

Non è quello viche ha fatto. Sebbene si digitino righe di comando in shell con spazi tra gli argomenti, le righe di comando sono in realtà sequenze discrete di stringhe internamente, non una lunga stringa separata da spazi. La shell ha separato la riga di comando in singole stringhe di argomenti prima dell'avvio del comando.

In C, le stringhe sono terminate con caratteri NUL e quelle sono mostrate come ^@.

Come si possono sostituire i caratteri speciali, in particolare quelli che iniziano con il simbolo di carati?

Per digitare quei caratteri, devi aggiungerli come prefisso Control- vper il carattere letterale successivo.

Ad esempio in questo caso: Control- vseguito da Control- @.

Il personaggio speciale che introduce letterali personaggi successivi è normalmente Control- vma in realtà è configurabile. Digitare stty -aper scoprire su cosa è impostato. Cerca lnextnell'output.


il post è informativo .. ma la vera soluzione per la mia domanda è sfuggire al simbolo dei carati - :%s#^@##g. Da quando copio, incollato dal terminale, vi li ha incollati come caratteri originali ...

1
@MadhavanKumar Non sfuggire alla simbolo di inserimento, perché non v'è nessun simbolo accento circonflesso. È davvero un vero personaggio di controllo. ^letterè solo una notazione visiva per questo, non c'è nessun vero custode. E sì, devi scappare dal carattere di controllo, il Ctrl-V è come lo fai dalla tastiera. Funziona soprattutto ovunque. Cordiali saluti, l'altra risposta contiene un'alternativa, specifica alla viriga di comando, per evitare di dover digitare il carattere di controllo.
Celada,

@MadhavanKumar Se il tuo terminale ha visualizzato i caratteri NUL come stringa di due caratteri ^@e tu l'hai incollato, allora usa \^@per rappresentare quella stringa di due caratteri in vi. Molti software usano la barra rovesciata per significare "interpretare il personaggio successivo letteralmente invece di usare la sua funzione speciale".
Gilles 'SO- smetti di essere malvagio' il

@Gilles, hai ragione .. questo è quello che ho provato a trasmettere a Celada ....

4

Quel simbolo rappresenta un carattere NULL, con valore ASCII 000.

Puoi provare:

:%s/\%x00/ /g

Alternativa:

Su una tastiera in cui il simbolo @ è in cima al 2tasto (grazie Celada) puoi fare:

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

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

dove <CTRL-2>significa premere prima CTRLil PC, tenendolo premuto, premere 2, rilasciare CTRL.

e <CTRL-SHIFT-2>significa prima premere il controlMac, tenendolo premuto, premere shiftil Mac, tenendolo premuto, premere 2, rilasciare controle shift.

Infine, entrambi i due comandi dovrebbero risultare %s/^@/ /gsullo schermo. ^@significa un singolo carattere, non ^seguito da @, quindi non puoi semplicemente digitare ^e @in una riga il comando sopra.

Questo comando sostituisce tutti i ^@caratteri con spazio.

( Fonte )


Quando dici "PC", intendi Windows?
Sparhawk,

1
CTRL-2 e CTRL-SHIFT-2 hanno senso solo nei layout di tastiera in cui @è in cima al 2tasto.
Celada,

@Sparhawk: No, intendo un PC Linux. :-)
erik

Perché CTRL Non ho mai visto un sistema in cui CTRL è la chiave utilizzata per spostarsi tra i diversi significati di una chiave. Questo è normalmente MAIUSC.
terdon

È strano (forse un bug in vim?), Ma funziona. Di solito dovrebbe essere ctrl + maiusc + 2 (su una tastiera americana). Ponetelo come una domanda separata o chiedete agli sviluppatori di VIM. Comunque la risposta di Celada è più generale per i personaggi di controllo.
erik,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.