Procura e substitui caracteres de controle (^ @, ^ M, ^ I…) no vi

11

Eu copiei esta linha de /proc/some_proc_id/cmdline na minha máquina ubuntu,

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

De alguma forma, os caracteres de espaço são representados por ^@ no vi. Eu tentei substituí-los por caracteres de espaço usando o comando

:%s#^@# #g

Mas diz: pattern not found ^@ .

Como podemos substituir caracteres especiais, particularmente aqueles que começam com o símbolo de quilate?

    
por Madhavan Kumar 19.07.2015 / 16:05

2 respostas

15

Somehow, the space characters are represented by ^@ in vi.

Não é vi que fez isso. Embora você digite linhas de comando em shells com espaços entre os argumentos, as linhas de comando são na verdade seqüências discretas de strings internamente, não uma string longa separada por espaço. O shell separou a linha de comando em sequências de argumentos individuais antes que o comando fosse iniciado.

Em C, as strings são terminadas com caracteres NUL e são mostradas como ^@ .

How can one replace special characters particularly those that start with carat symbol?

Para digitar esses caracteres, você deve prefixá-los com Controle - v para o próximo caracter literal.

Por exemplo, neste caso: Controle - v seguido por Controle - @ .

O caractere especial que introduz os próximos caracteres literais é normalmente Controle - v , mas na verdade é configurável. Digite stty -a para descobrir o que está definido. Procure lnext na saída.

    
por 19.07.2015 / 16:16
4

Esse símbolo representa um caractere NULL, com valor ASCII 000.

Você pode tentar:

:%s/\%x00/ /g

Alternativa:

Em um teclado onde o símbolo @ está no topo da tecla 2 (obrigado Celada) você pode fazer:

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

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

onde <CTRL-2> significa primeiro pressionar a CTRL no PC, mantendo-a pressionada, tecle 2 , libere CTRL . / p>

e <CTRL-SHIFT-2> significam primeiro pressionar o controle no Mac, mantendo-o pressionado, pressione shift no Mac, mantendo-o pressionado, pressione < kbd> 2 , libere control e shift .

Finalmente, os dois comandos devem resultar em %s/^@/ /g na tela. ^@ significa um único caractere, não ^ seguido por @ , portanto, você não pode simplesmente digitar ^ e @ em uma linha no comando acima.

Este comando substitui todos os caracteres ^@ por espaço.

( Fonte )

    
por 19.07.2015 / 16:35