Como removeria todos os caracteres não-ascii de um arquivo? Haveria um comando específico para fazer isso?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Acredito que isso encontre os caracteres no fluxo de trabalho, mas como removeria todas as instâncias dos caracteres em questão?
text-processing
ascii
Mizole Ni
fonte
fonte
cat -v
-los para mostrá-los na representação ASCII para eles. (por exemplo,^G
para\007
)Respostas:
Caracteres ASCII são caracteres no intervalo de 0 a 177 (octal), inclusive .
Para excluir caracteres fora deste intervalo em um arquivo, use
O
tr
comando é um utilitário que funciona com caracteres únicos , substituindo-os por outros caracteres únicos (transliteração), excluindo-os ou compactando execuções do mesmo caractere em um único caractere.O comando acima deve ler
file
e escrever o conteúdo modificado paranewfile
. A-d
opção detr
fazer o utilitário excluir caracteres (em vez de transliterá-los) e-c
considerar caracteres fora do intervalo especificado (em vez de dentro).LC_ALL=C
garante que cada valor de byte crie um caractere válido. Sem ele, algumastr
implementações seriam abortadas se encontrassem sequências de bytes que não formam caracteres válidos na codificação de caracteres do código do idioma.Para substituir o arquivo original pelo modificado, use
Isso renomeia o novo arquivo para o nome do arquivo antigo após a
tr
conclusão com êxito. Setr
não for concluído com êxito, porque ele não pôde ler o arquivo original ou não gravou no novo arquivo, o arquivo original permanecerá inalterado.Como alternativa, para preservar o máximo possível dos metadados (permissões etc.) do arquivo original, use
fonte
Com
perl
fonte
Se tudo o que você precisa é de uma regex:
[\x00-\x7F]
você pode aplicar a vários utilitários:Entenda que sed, awk e perl esperam "arquivos de texto", conforme definido no Unix. Tudo funciona bem neste caso. Mas, especificamente, o awk adiciona uma nova linha à direita (se ela existe no arquivo de origem ou não) (usar printf remove TODAS as novas linhas na entrada). O tr foi projetado para funcionar com qualquer tipo de arquivo. No entanto, o NUL (
\0
) não é um caractere válido em um arquivo de texto POSIX e deve ser evitado:De fato, muitos caracteres de controle gerariam outros problemas sob algumas condições específicas.
Então, provavelmente você precisa
[\x07-\x0d\x20-\x7e]
O intervalo de 7-13 (em decimal) é
\a\b\t\n\v\f\r
(em ordem).Um intervalo semelhante (provavelmente mais portátil) pode ser escrito como
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bell e backspace--).Relacionado:
Regex qualquer
solução Perl de caractere ASCII
Arquivo de texto Posix
fonte
tr
pode ser qualquer tipo de arquivo, não apenas arquivos de texto.awk
por outro lado, pega um arquivo de texto.gensub()
é uma extensão gawk. Você gostariagsub(...); print
e usaria sequências octal em vez de hexadecimal (e LC_ALL = C) para ser (mais) portátil.[^\o0]
deve corresponder a caracteres diferentes da barra invertida, o e 0 no POSIXsed
(em todas as implementações, exceto GNU sed). Isso não é uma limitação do GNU,sed
mas uma extensão não compatível, e é por isso que é desativado quando POSIXLY_CORRECT está no ambiente).