Rechercher caracteres ascii etendus dans un fichier
dubcek Messages postés 18627 Date d'inscription Statut Contributeur Dernière intervention -
je suis sur solaris et je fabrique un fichier xml à partir des données reçues de sybase.
or ce fichier contient des caracteres ascii non affichables qui font planter mon script.
Je les corrige un par un après chaque plantage mais j'aimerais pouvoir retrouver d'un coup tous ces caracteres.
Avez-vous une solution svp?
Cordialement
14 réponses
Des caractères ASCII non affichables dans un fichier XML généré sur Solaris à partir de données Sybase provoquent des plantages de script, et l’objectif est de les repérer tous en une fois. La meilleure piste a été d’utiliser la commande tr -d "\200-\377" sur le fichier pour supprimer ces caractères, selon la réponse privilégiée, puis d’autres méthodes ont été discutées. Des essais avec awk, nawk ou mawk, et des tentatives de filtrage par grep, sont apparus comme alternatives, avec des résultats variables et des questions sur les plages de caractères à cibler. En cas de besoin, certaines expérimentations portent sur la différence entre awk, nawk et mawk sur Solaris, et sur la difficulté de localiser sans altérer le fichier.
-
hello
essayertr -d "\200-\377" < fichier
-
Salut,
Une solution pourrait être de supprimer ou de substituer le code octal et/ou hexa de ces caractères via la commande sed...
Peut être qu'en ayant un exemple concret on pourrait t'aider un peu mieux ;-\
-
merci pour ta réponse
le fichier fait 20,000 lignes environ
par exemple je viens d'avoir un nouveau plantage sur cette zone:
---------
With" Direction="Next" EventID="3757" AssociatedFile="mx.113
722.0000.S.in.xml">MOODY\264S CORP
8771 <Focus FocusCode="Browse(9)
--------------
donc j'aimerais pouvoir rapidement trouver tout ces \XXX pour pouvoir corriger avant de lancer l'execution. Le code XXX est à chaque fois différent donc je ne pense pas pouvoir utiliser la commande sed. -
merci mais ça ne marche pas et de plus je dois trouver n'importe quel code pas seulement \264
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
merci beaucoup ça marche en changeant la plage qui était trop large.
par contre j'ai besoin de trouver ces caractères dans le fichier pas les effacer. As-tu une solution?
J'ai essayé grep:
grep "\321" try2.txt
grep: RE error 25: ''\digit'' out of range.
au pire je ferai un diff entre le fichier original et le fichier purgé. -
essayer
awk -F "" '{x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' fichier -
bonjour merci mais ça donne ça:
bash$ awk -F "" '{x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' iss
awk: can't open {x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}
ça me parait un peu difficile de parser le fichier entier avec hawk. -
essayer
awk 'BEGIN{FS=""} {x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' iss -
test
-
avec sed ça ne marche qu'avec les codes commençant par 0 mais pas ceux commençant par 1 ou 2 genre 321 ou 264
j'ai essayé en hexadecimal : 321 c'est d1
donc:
bash$ echo -e 'ESPA\xd1A'| sed -e 's/'$(echo "\xd1")'/NI/g'
ESPAÑA
ça ne marche pas
la seule solution que j'ai pour l'instant (merci dubcek):
tr -d "\264" < try2.txt
puis un diff du résultat
et ce pour chaque caractère spécial!
donc pas terrible... -
le forum supprime ma commande !!
essayer de remplacer -F "" '{x= par 'BEGIN{FS=""} {x=
essayer aussi avec nawk -
merci dubcek
j'ai essayé:
awk 'BEGIN{FS=""} {x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' try2.txt
et
nawk 'BEGIN{FS=""} {x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' try2.txt
mais ça ne retourne rien!
n'y aurait-il pas une solution avec perl? -
awk '{x=0; for(n=1; n<=length(); n++)if(s=substr($0, n, 1) > "\177" && s < "\377")x++; if(x)print $0}'
-
on fabrique un range pour egrep, essayer
egrep "$(awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}')" fichier-
-
-
bash$ awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}'
\410|\411|\412|\413|\414|\415|\416|\417|\420|\421|\422|\423|\424|\425|\426|\427|\430|\431|\432|\433|\434|\435|\436|\437|\440|\441|\442|\443|\444|\445|\446|\447|\450|\451|\452|\453|\454|\455|\456|\457|\460|\461|\462|\463|\464|\465|\466|\467|\470|\471|\472|\473|\474|\475|\476|\477|\500|\501| -
-
bash$ nawk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}'
\410|\411|\412|\413|\414|\415|\416|\417|\420|\421|\422|\423|\424|\425|\426|\427|\430|\431|\432|\433|\434|\435|\436|\437|\440|\441|\442|\443|\444|\445|\446|\447|\450|\451|\452|\453|\454|\455|\456|\457|\460|\461|\462|\463|\464|\465|\466|\467|\470|\471|\472|\473|\474|\475|\476|\477|\500|\501|
-