Processando caracteres de controle

2

Eu tenho um arquivo de log que contém um monte de caracteres de controle não visíveis, como hex \ u0003.

Eu gostaria de substituir isso usando algo como SED, mas não consigo fazer a primeira parte da regex corresponder:

/s/^E/some_string

Estou criando o ^ E pressionando CTRL-V CTRL-0 CTRL-3 para criar o caractere especial, conforme lido na página 'man ascii':

003 3 03 ETX

No entanto, nada corresponde a esse caractere de controle.

Qualquer ajuda apreciada!

    
por Benjamin Wootton 14.01.2011 / 14:48

4 respostas

4

Você também pode usar o comando tr . Por exemplo:

Para excluir o caractere de controle:

tr -d '3' < file

Para substituir o caractere de controle por outro:

tr '3' 'x' < file

Se você não tiver certeza de qual é o valor do caractere de controle, execute um dump octal e ele será impresso:

$ cat file
hello
^[
world

$ od -b file    
0000000 150 145 154 154 157 012 033 012 167 157 162 154 144 012
0000016

Portanto, o valor do caractere de controle ^[ é 3 .

    
por 14.01.2011 / 17:11
2

Esse perl one-liner fará o trabalho - cuidado, ele modificará o arquivo:

perl -i -pe 's#\x{0003}#some_string#g' /path/to/log/file

Se você deseja substituir vários caracteres com códigos de caracteres entre um intervalo especificado:

echo {A..Z} | perl -i -pe 's#[\x{0040}-\x{0047}]#P#g'
P P P P P P P H I J K L M N O P Q R S T U V W X Y Z 

( echo {A..Z} produz uma string de caracteres alfabéticos no bash)

    
por 14.01.2011 / 16:49
1

Isso substituirá todos os caracteres não imprimíveis por #

sed 's/[^[:print:]]/#/g' logfile
    
por 15.01.2011 / 07:31
0

Não tenho certeza se entendi o que você quer, mas se é para substituir ocorrências dos sucessivos bytes hexadecimais 0x00 0x03, isso deve funcionar:

$ echo '0 61 20 00 03 0A' | xxd -r | sed 's/\x00\x03/test/g' 
a test
    
por 15.01.2011 / 09:02