2017-01-17 2 views
0

Je reçois les caractères indésirables (<9f>, <9d>, <9d> etc), les caractères CNTRL (^Z, ^M etc) et NULL (caractères ^@) dans un fichier. Cependant, j'ai pu supprimer les caractères CNTRL et NULL du fichier, mais je n'ai pas pu éliminer les caractères indésirables. Quelqu'un pourrait-il suggérer un moyen de supprimer ces caractères indésirable?supprimer les caractères indésirables d'un utf-8 fichier sous Unix

Screen shot for Junk Data

Les caractères de contrôle sont retirés à l'aide de la commande suivante:

sed 's/\x1a//g;s/\xef\xbf\xbd//g' 

caractères NULL sont supprimées à l'aide de la commande ci-dessous

tr -d '\000' 

En outre, S'il vous plaît un suggérer une seule commande supprimer tous les 3 types de caractères garbal mentionnés ci-dessus.

Merci à l'avance

+0

Dos2Unix ne fonctionne pas non plus. l'erreur indique «problèmes de conversion de fichier» – user2975559

+0

dans quel codage est le fichier? Pouvez-vous coller le fichier sur pastebin.com? – hansaplast

+0

le codage du fichier est utf-8. Désolé, je n'ai pas pu placer le fichier. – user2975559

Répondre

1

Strip « inhabituelles » caractères unicode

Dans les commentaires que vous mentionnez que vous voulez bloquer les caractères de contrôle tout en gardant les caractères grecs, donc la solution ci-dessous avec tr ne convient pas. Une solution est sed qui offre un support Unicode et leur classe [[:alpha:]] correspond également à des caractères alphabétiques en dehors des ascii. Vous devez d'abord définir LC_CTYPE pour spécifier les caractères qui appartiennent à la plage [[:alpha:]]. Pour l'allemand avec trémas, c'est par ex.

LC_CTYPE=de_DE.UTF-8 

Ensuite, vous pouvez utiliser sed pour enlever tout ce qui est pas une lettre ou de ponctuation:

sed 's/[^[:alpha:];\ [email protected]]//g' < junk.txt 

Qu'est-ce \ [email protected] fait: Il correspond à tous les caractères de la plage ascii entre l'espace et @ (voir ascii table Sed a une classe [[:punct:]], mais malheureusement, cela correspond également à beaucoup d'ordure, donc \ [email protected] est nécessaire

Vous devrez peut-être jouer un peu avec LC_CTYPE, en le mettant à utf-8 seulement je pourrais correspondre aux caractères grecs, mais pas japonais.

Si vous ne vous préoccupez ascii

Si vous ne vous préoccupez des personnages réguliers ascii vous pouvez utiliser tr: D'abord, vous convertissez le fichier à un codage « un octet par caractère », puisque tr ne comprend pas les caractères multi-octets, par exemple en utilisant iconv. Puis, je vous conseille d'utiliser une approche de liste blanche (par opposition à l'approche de la liste noire que vous avez dans votre question) car il est beaucoup plus facile d'indiquer ce que vous voulez conserver que ce que vous voulez filtrer.

Cette commande devrait le faire:

iconv -c -f utf-8 -t latin1 < junk.txt | tr -cd '\11\12\40-\176' 

cette ligne ..

  • convertit à latin1 (seul octet par char) et ne tient pas compte de tous les caractères ci-dessus codepoint 127 (qui sont les caractères spéciaux, mais il faut savoir, que les bandes loin aussi des choses comme des caractères umlaut ou spéciaux dans votre langue que vous voudrez peut-être pour garder!)
  • supprime tous les caractères qui sont en dehors de cette liste blanche: \11\12\40-\176. Les chiffres sont octaux. Regardez par exemple this ascii table. \11 est tab, \12 est le retour chariot. \40-\176 est tous les caractères qui sont généralement considérés comme "normal"
+0

Merci pour la suggestion. J'ai déjà utilisé cette commande tr -cd '\ 11 \ 12 \ 40- \ 176'. Tous les caractères indésirables ont été supprimés. Cependant, je perds aussi des caractères grecs. J'ai besoin de ces caractères grecs – user2975559

+0

Et aussi si je convertis le fichier de utf-8 à nous-latin en utilisant iconv je perds tous les caractères Unicode comme les données du Japon, les données grecques – user2975559

+0

@ user2975559 J'ai élargi ma réponse pour également correspondre aux caractères Unicode au-delà de l'ensemble ascii, pouvez-vous vérifier si cela résout votre problème? – hansaplast