Rechercher caracteres ascii etendus dans un fichier

yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
bonjour,
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
A voir également:

14 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
essayer
tr -d "\200-\377" < fichier
1
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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 ;-\
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Isole ta portion de code dans un fichier et essaie avec une de ces deux commandes :

sed 's/\xb4//' fich_entrée > fich_sortie
ou
sed 's/'$(echo "\0264")'//' fich_entrée > fich_sortie
ou
tr '\264' ' ' fich_entrée
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
merci mais ça ne marche pas et de plus je dois trouver n'importe quel code pas seulement \264
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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é.
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
non en fait ça ne marche pas avec le range
seulement
tr -d "\264" < try2.txt
ou bien
tr -d "\321" < try2.txt
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
essayer
awk -F "" '{x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' fichier
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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.
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
essayer
awk 'BEGIN{FS=""} {x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' iss 
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
test
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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...
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
le forum supprime ma commande !!
essayer de remplacer -F "" '{x= par 'BEGIN{FS=""} {x=
essayer aussi avec nawk
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
awk '{x=0; for(n=1; n<=length(); n++)if(s=substr($0, n, 1) > "\177" && s < "\377")x++; if(x)print $0}'
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
awk Solaris ne comprend peut-être pas FS=""
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
encore mais ça ne marche pas
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
que répondent avec tout les awk de Solaris (awk, nawk, etc)
mawk est le vieil awk de Linuix
$ echo tollé | awk '{print length(), $0}'
5 tollé
$
$ echo tollé | mawk '{print length(), $0}'
6 tollé
$
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
salut dubcek,
bash$ echo toll | awk '{print length(), $0}'
4 toll
bash$ echo toll | mawk '{print length(), $0}'
-bash: mawk: command not found
bash$ echo toll | nawk '{print length(), $0}'
4 toll
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
pas toll mais tollé
il faut tester avec un caractère étendu
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
on fabrique un range pour egrep, essayer
egrep "$(awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}')"  fichier
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
il ne fait rien comme si il manquait un paramètre
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
un message d'erreur ?
qu'affiche la commande
awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}'
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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|
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
et avec nawk
0
yakitori1 Messages postés 64 Date d'inscription   Statut Membre Dernière intervention  
 
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|
0