Comment supprimer tous les caractères non ascii d'un fichier? Y aurait-il une commande spécifique pour effectuer cela?
grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...
Je crois que cela trouve les personnages dans le flux de travail, mais comment supprimer toutes les instances des personnages en question?
text-processing
ascii
Mizole Ni
la source
la source
cat -v
pour les représenter en représentation ASCII pour eux. (par exemple^G
pour\007
)Réponses:
Les caractères ASCII sont des caractères compris entre 0 et 177 (octal) inclusivement .
Pour supprimer des caractères hors de cette plage dans un fichier, utilisez
La
tr
commande est un utilitaire qui fonctionne sur des caractères uniques , soit en les remplaçant par d'autres caractères simples (translittération), soit en les supprimant, soit en compressant des séquences du même caractère en un seul caractère.La commande ci-dessus lit
file
et écrit le contenu modifié dansnewfile
. L'-d
option permettant àtr
l'utilitaire de supprimer les caractères (au lieu de les translittérer) et de le-c
faire considérer les caractères en dehors de l'intervalle donné (au lieu de l'intérieur).LC_ALL=C
s'assure que chaque valeur d'octet constitue un caractère valide. Sans cela, certainestr
implémentations seraient abandonnées si elles trouvaient des séquences d'octets qui ne forment pas de caractères valides dans le codage de caractères des paramètres régionaux.Pour remplacer le fichier d'origine par le fichier modifié, utilisez
Cela renomme le nouveau fichier au nom de l'ancien fichier une fois
tr
terminé. Sitr
cela ne se termine pas correctement, soit parce qu'il n'a pas pu lire le fichier d'origine ou ne pas écrire dans le nouveau fichier, le fichier d'origine restera inchangé.Alternativement, pour conserver autant que possible les métadonnées (autorisations, etc.) du fichier d'origine, utilisez
la source
Avec
perl
la source
Si tout ce dont vous avez besoin est une expression régulière:
[\x00-\x7F]
que vous pouvez appliquer à plusieurs utilitaires:Comprenez que sed, awk et perl attendent des "fichiers texte" tels que définis dans Unix. Tous fonctionnent bien dans ce cas. Mais en particulier, awk ajoute une nouvelle ligne de fin (qu'elle existe ou non dans le fichier source) (l'utilisation de printf supprime TOUS les retours à la ligne en entrée). Le tr est conçu pour fonctionner avec n'importe quel type de fichier. Cependant, NUL (
\0
) n'est pas un caractère valide dans un fichier texte POSIX et doit être évité:En fait, de nombreux caractères de contrôle généreraient d'autres problèmes dans certaines conditions spécifiques.
Donc, vous avez probablement besoin
[\x07-\x0d\x20-\x7e]
La plage 7-13 (en décimal) est
\a\b\t\n\v\f\r
(dans l'ordre).Une plage similaire (probablement plus portable) pourrait s'écrire
[^[:space:][:print:]] (similar because it doesn't include
\ a \ b` --bell et backspace--).En relation:
Regex n'importe quel caractère ASCII
Solution Perl
Fichier de texte Posix
la source
tr
peut être n'importe quel type de fichier, pas seulement des fichiers texte.awk
d'autre part, prend un fichier texte.gensub()
c'est une extension gawk. Vous voudriezgsub(...); print
, et utilisez octal au lieu de séquences hexadécimales (et LC_ALL = C) pour être (plus) portable.[^\o0]
est de faire correspondre les caractères autres que la barre oblique inverse, o et 0 dans POSIXsed
(dans toutes les implémentations sauf GNU sed). Ce n'est pas une limitation de GNUsed
mais une extension non conforme, c'est pourquoi elle est désactivée lorsque POSIXLY_CORRECT est dans l'environnement).