Problema removendo / substituindo caractere especial °

1

Eu não consigo eliminar este símbolo °.

Eu tentei:

  sed 's/°//g' file.txt

e

  sed 's/\°//g' file.txt

mas ambos não funcionaram.

Estou executando o ubuntu 16.

O símbolo não parece ser detectado - copiei e colei.

Isso não fez nada para encontrar o símbolo

  sed '/°/!d' file.txt

Alguma sugestão?

    
por speld_rwong 13.09.2017 / 18:04

2 respostas

2

Já o primeiro deve funcionar. Este símbolo não tem um significado especial, embora seja um caractere não-ascii. Não é necessário \ , não seja oportunista, se funcionar sem \ , faça isso funcionando dessa maneira! É como se você tentasse

sed 's/ő//g'

Em tais casos, os motivos mais prováveis são:

  1. Problema de codificação. Verifique, em qual codificação está o arquivo ( file -szL file.txt ), e em qual codificação você está usando ( echo $LANG ). É porque o " ° " pode ter uma sequência de bytes diferente nas diferentes codificações. Melhor se ambos estiverem em utf-8. Extensão: O Ubuntu 16 é bom utf-8 amigável por padrão, no máximo no caso de sistema atualizado apenas nos EUA, muito antigo, continuamente, posso imaginar esse problema de codificação. É muito mais realista que o seu arquivo de texto não esteja no utf-8. O comando file dirá para você.
  2. Você pode filtrar por um caractere similar , mas não pelo caractere exato. Existem milhares de caracteres exibíveis em um sistema não muito antigo, utf-8, muitos deles são hieróglifos especiais como esse, qualquer um deles é muito parecido. A solução é fácil também neste caso: cat do arquivo e copie e cole o glifo em sua linha de comando.

Se você os seguiu, 95% encontrou e corrigiu o problema neste ponto. O restante é para os 10% dos casos.

Se nada disso funcionar, você pode depurar as coisas no nível de bytes mais profundo. No seu caso eu faria isso:

  1. Primeiramente, eu começaria este comando sed , mas daria a /dev/zero como fonte: sed 's/°//g' </dev/zero >/dev/null . Isso resultará que o sed funcionará em um loop infinito, trabalhando em um fluxo longo infinito de zero bytes, e não sairá no local. Então, você pode depurá-lo.
  2. Suspenda sua execução com um ctrl / z.
  3. Verifique seu pid com pidof sed . Você obtém um número inteiro máximo de 5 dígitos.
  4. Com um hexcat /proc/12345/cmdline , você poderá ver os dados em nível de byte dessa linha de comando sed.
  5. Você pode verificar a codificação em nível de bytes do " ° " fazendo o mesmo hexcat file.txt .
  6. Os dois devem corresponder. Se não, há algum mal na imagem, tente (2) ou faça uma nova pergunta.

Muitas distribuições Linux simplesmente removeram hexcat , uma de suas ferramentas mais úteis, de seus distribuidores, porque acham que ninguém usou isso. Mas há alguma outra ferramenta, até onde eu me lembro, talvez xxd seja uma delas. Se você não consegue fazer hexa lixeiras com nada, faça uma nova pergunta.

    
por 13.09.2017 / 18:15
0

Bem, tente esta abordagem fácil:

echo "°" | xxd

Isso retornará algo como:

0000000: c2b0 0a

Você precisa do código c2b0 , acho que 0a é o novo caractere de linha.

Em seguida, tente:

sed -e 's/\xc2\xb0//' file.txt

Espero que funcione.

    
por 13.09.2017 / 18:48