sed's/[^ - ~]//g'
provavelmente não é o comando que você usou, porque ele apenas reclamaria de um comando inválido. Sempre copie e cole!
Eu presumo que você tenha executado sed 's/[^ -~]//g'
. Isso substitui qualquer caractere que não seja um caractere ASCII imprimível por uma cadeia vazia. Em outras palavras, isso remove todos os caracteres que não são caracteres ASCII imprimíveis. (Observe que isso é verdadeiro na localidade padrão, ou seja, em LC_ALL=C
, mas não é o caso em muitas outras localidades.)
Para manter as colunas alinhadas, substitua cada caractere não imprimível por um espaço.
sed 's/[^ -~]/ /g'
Devido ao comando grep
, somente as linhas que continham caracteres não imprimíveis aparecerão na saída. Você não precisa de grep
. Passe todas as linhas para sed
; as linhas que não precisam ser modificadas aparecerão no lugar certo na saída.
<file.txt LC_ALL=C sed 's/[^ -~]/ /g' >new-file.txt
Isso adiciona espaços no meio das colunas, por exemplo você vai acabar com
GAVISCON LIQUID PEPPERMINT OT 000022000362700 159588000007979400 50001584182 0006S020000
Se você quiser que os espaços acabem à direita da coluna, por exemplo
GAVISCON LIQUID PEPPERMINT OT 000022000362700 159588000007979400 50001584182 0006S020000
você precisará de uma abordagem diferente, onde você indica onde as colunas param. Embora isso possa ser feito no sed, é muito mais fácil no awk. Veja como você pode remover caracteres não imprimíveis da primeira coluna e manter os dados das outras colunas começando na posição 49.
<file.txt LC_ALL=C awk '{
first_column = substr($0, 1, 48);
gsub(/[^ -~]/, "", first_column);
printf "%-48s%s\n", first_column, substr($0, 49)
}' >new-file.txt