use sed para substituir nbsp, 160, Hex 00a0, Octal 240, espaço sem quebra

6

Estou tendo alguns problemas com arquivos de configuração que têm os caracteres espaço sem quebra .

Como devo especificar esse caractere com sed para que eu possa substituí-lo por um espaço.

sed -n 's/ / /g'

exemplos dos erros

service named restart
Stopping named:                                            [  OK  ]
Starting named: 
Error in named configuration:
named.localhost:2: unknown RR type 'SOA '
named.localhost:8: unknown RR type '@'
named.localhost:9: unknown RR type '127.0.0.1'
named.localhost:10: unknown RR type '::1'
.....

Eu tentei incluir um formulário de linha no arquivo original incorreto nesta postagem. Não parece estar funcionando. Pastebin download costuras para ser a única ferramenta que mantém todo o binário original. link . Você deve poder copiar e passar da linha original e fazer com que funcione no seu terminal.

    
por nelaaro 11.12.2012 / 14:40

2 respostas

13

A resposta a esta pergunta depende de qual dos caracteres de espaço não-violador você está encontrando.

Abaixo estão exemplos de como substituir cada um dos caracteres de espaço não quebráveis mencionados no título das perguntas e adicionalmente a versão UTF-8 ( C2 A0 ) que o OP está realmente perguntando de acordo com a saída pastebin.

Todos os exemplos usam printf para gerar a saída, pois é mais portável do que echo . Os caracteres de espaço são substituídos por X para tornar a saída mais clara.

Exemplos

html

printf '&#nbsp;\n' | sed 's/ /X/g'
printf ' \n'  | sed 's/&160;/X/g'
printf ' \n'  | sed 's/&[aA]0;/X/g'

octal 240 = decimal 160 = hexadecimal A0

printf '\xA0\n' | sed 's/\xA0/X/g'

Ou com tr :

printf '\xA0\n' | tr '0' 'X'

U + 00A0

printf '\x00\xA0\n' | sed 's/\x00\xA0/X/g'

UTF-8

printf '\xC2\xA0\n' | sed 's/\xC2\xA0/X/g'

Resultado

A saída em todos os casos acima é:

X

Resposta

Agora, para sua pergunta, você tem dados assim:

printf '@       IN SOA  @ rname.invalid. (' | od -x

Saída:

0000000 c240 c2a0 c2a0 c2a0 c2a0 c2a0 20a0 4e49
0000020 5320 414f a0c2 4020 7220 616e 656d 692e
0000040 766e 6c61 6469 202e 0a28
0000052

Para substituir o C2 A0 s pelo espaço comum, use este:

printf '@       IN SOA  @ rname.invalid. (' | sed 's/\xC2\xA0/ /g' | od -x

Saída:

0000000 2040 2020 2020 2020 4e49 5320 414f 2020
0000020 2040 6e72 6d61 2e65 6e69 6176 696c 2e64
0000040 2820 000a
0000044
    
por 11.12.2012 / 14:50
2

Obrigado por todos aqueles que me ajudam a chegar a uma solução de trabalho.

Eu tentei incluir um formulário de linha no arquivo original incorreto nesta postagem. Não parece estar funcionando. Pastebin download costuras para ser a única ferramenta que mantém todo o binário original. link . Você deve poder copiar e passar da linha original e fazer com que funcione no seu terminal.

Então, aqui está o que acontece se eu remover o octal 40 ou o hex \xA0 . Acrescenta alguns outros personagens divertidos.

$ echo "@       IN SOA  @ rname.invalid. (" | sed -e "s/\xA0//g"
@������ IN SOA� @ rname.invalid. (

Existem alguns dados extras não impressos nos arquivos reais. Eu encontrei o od (octal despejo) ferramenta bastante útil para me mostrar o que o hex / oct / binário real valores para toda a linha são.

$ echo "@       IN SOA  @ rname.invalid. (" | od -x
0000000 c240 c2a0 c2a0 c2a0 c2a0 c2a0 20a0 4e49
0000020 5320 414f a0c2 4020 7220 616e 656d 692e
0000040 766e 6c61 6469 202e 0a28
0000052

O outro caracter que continuou aparecendo foi \xC2 . Ele não é impresso quando o espaço não divisório \xA0 está lá, mas aparece se o nbsp for removido. Então eu tive que modificar a linha sed na @Thor resposta para removê-la também.

Isso é o que funcionou para mim.

$ echo "@       IN SOA  @ rname.invalid. (" | sed -e "s/\xC2\xA0/ /g"
@       IN SOA  @ rname.invalid. (
    
por 12.12.2012 / 12:17