Pesquise e substitua os caracteres de controle (^ @, ^ M, ^ I…) no vi

14

Copiei esta linha da /proc/some_proc_id/cmdlineminha 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. Tentei substituí-los por caracteres de espaço usando o comando

:%s#^@# #g

Mas diz pattern not found ^@.

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

Gilles 'SO- parar de ser mau'
fonte
Qual é o tipo de terminal que você está usando?
Ed Heal #:
às vezes, TERMe muitas vezes, éscreen
Qual é o programa do terminal que você está usando e a TERMvariável de ambiente está definida corretamente?
21715 Ed Heal

Respostas:

15

De alguma forma, os caracteres de espaço são representados por ^@no vi.

Não foi o vique fez isso. Embora você digite linhas de comando em shells com espaços entre os argumentos, as linhas de comando são, na verdade, sequências discretas de seqüências internamente, não uma sequência longa e separada por espaços. O shell separou a linha de comandos em sequências de argumentos individuais antes do lançamento do comando.

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

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

Para digitar esses caracteres, você deve prefixá-los com Control- vpara o próximo caractere literal.

Por exemplo, neste caso: Control- vseguido por Control- @.

O caractere especial que introduz os próximos caracteres literais é normalmente Control- vmas é realmente configurável. Digite stty -apara descobrir como está definido. Procure lnextna saída.

Celada
fonte
o post é informativo .. mas a solução real para minha pergunta é escapar do símbolo de quilates - :%s#^@##g. Desde que eu copiar, colado de terminal, vi tem colado-los como personagens originais ...
1
@MhavhavanKumar Você não escapa do símbolo de sinal de intercalação, porque não existe um símbolo de sinal de intercalação. É realmente um personagem de controle real. ^letteré apenas uma notação visual para isso, nenhum sinal real envolvido. E sim, você precisa escapar do caractere de controle, o Ctrl-V é como você faz isso no teclado. Isso funciona mais em todos os lugares. Para sua informação, a outra resposta contém uma alternativa específica da vilinha de comando para evitar a necessidade de digitar o caractere de controle.
Celada
@MadhavanKumar Se o seu terminal exibiu os caracteres NUL como a sequência de dois caracteres ^@e você a copiou e colou, use-a \^@para representar essa sequência de dois caracteres no vi. Muitos softwares usam barra invertida para significar "interpretar o próximo caractere literalmente, em vez de usar sua função especial".
Gilles 'SO- stop be evil'
@Gilles, você está certo .. é isso que eu tentei transmitir aos Celada ....
4

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

Você poderia tentar:

:%s/\%x00/ /g

Alternativo:

Em um teclado em que o símbolo @ está em cima da 2tecla (obrigado Celada), você pode:

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

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

onde <CTRL-2>significa primeiro pressione o CTRLPC no PC, mantendo-o pressionado, pressione 2, solte CTRL.

e <CTRL-SHIFT-2>significa primeiro pressionar e pressionar o controlMac, mantendo pressionado, pressionar e pressionar shiftMac, mantendo pressionado, pressionar 2, soltar controle shift.

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

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

( Fonte )

erik
fonte
Quando você diz "PC", você quer dizer Windows?
Sparhawk
1
CTRL-2 e CTRL-SHIFT-2 só fazem sentido nos layouts de teclado onde @está o topo da 2tecla.
22915 Celada
@ Sparhawk: Não, quero dizer um pc linux. :-)
erik
Por que CTRL? Eu nunca vi um sistema em que CTRL é a chave usada para alternar entre o significado diferente de uma chave. Isso normalmente é SHIFT.
terdon
É estranho (talvez um bug no vim?), Mas funciona. Normalmente, deve ser ctrl + shift + 2 (em um teclado americano). Faça isso como uma pergunta separada ou pergunte aos desenvolvedores do vim. De qualquer forma, a resposta de Celada é mais geral para caracteres de controle.
2111 erik