Comando Bash para substituir todos os caracteres não imprimíveis?

1

Eu tenho um script bash que verifica as alterações no banco de dados e envia essas mudanças por e-mail. Funciona legal, até que tenta enviar algo não imprimível, que "quebra" o e-mail.

Existe alguma maneira prática de substituir todos os caracteres não imprimíveis de uma string pelo seu código hexadecimal (algo como " abc < 1A > def < 07 > xyz ")?

Tudo o que eu consigo pensar é uma cadeia de comandos sed que entrega um único caractere cada. O que não parece certo.

edit: Depois de postar essa pergunta, encontrei o comando cat -v fazendo principalmente o que eu queria. Usando isso por enquanto, a menos que alguém aponte algo melhor.

    
por David162795 27.03.2015 / 13:49

2 respostas

3

Você pode usar uma substituição simples como

perl -pe 's/([^[:print:]\n])/sprintf("<%02X>", ord($1))/ge'

O comando less tem um formato de saída bastante semelhante ao que você especifica, mas imprime os caracteres de controle em sua string de exemplo literalmente para mim. Talvez você tenha mais sorte com isso (estou pensando que meu sistema é moderno demais :-). Ele não deve executar a paginação quando a saída não é para um terminal, então deve passar - esperançosamente, com as substituições desejadas - quando você executá-lo a partir do seu crontab.

    
por 30.03.2015 / 10:05
0

Use um incremental 'for' com grupos ASCII.

Esses são os valores hexadecimais que você deve cobrir (ASCII): 20-2F 3A-40 5B-60 7B-FF

Então, basicamente, com apenas 4 fors, você cobre todos os personagens, exceto números e letras. Excluindo mais complica coisas (como se você não wat para remover "-" ou "_" por exemplo).

    
por 27.03.2015 / 14:09