Rechercher caracteres ascii etendus dans un fichier

yakitori1 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18627 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

14 réponses

Résumé de la discussion

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.

Bobot (l'IA à votre service)
  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    essayer
    tr -d "\200-\377" < fichier
    1
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
     
    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
  3. yakitori1 Messages postés 15 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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 503
       
      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
  4. yakitori1 Messages postés 15 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. yakitori1 Messages postés 15 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
    1. yakitori1 Messages postés 15 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
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essayer
    awk -F "" '{x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' fichier
    0
  8. yakitori1 Messages postés 15 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
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essayer
    awk 'BEGIN{FS=""} {x=0; for(n=1; n<=NF; n++)if($n > "\177" && $n < "\377")x++; if(x)print $0}' iss 
    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    test
    0
  11. yakitori1 Messages postés 15 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
  12. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    le forum supprime ma commande !!
    essayer de remplacer -F "" '{x= par 'BEGIN{FS=""} {x=
    essayer aussi avec nawk
    0
  13. yakitori1 Messages postés 15 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
  14. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    awk '{x=0; for(n=1; n<=length(); n++)if(s=substr($0, n, 1) > "\177" && s < "\377")x++; if(x)print $0}'
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      awk Solaris ne comprend peut-être pas FS=""
      0
    2. yakitori1 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
       
      encore mais ça ne marche pas
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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
    4. yakitori1 Messages postés 15 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
    5. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      pas toll mais tollé
      il faut tester avec un caractère étendu
      0
  15. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    on fabrique un range pour egrep, essayer
    egrep "$(awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}')"  fichier
    0
    1. yakitori1 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
       
      il ne fait rien comme si il manquait un paramètre
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      un message d'erreur ?
      qu'affiche la commande
      awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}'
      0
    3. yakitori1 Messages postés 15 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
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      et avec nawk
      0
    5. yakitori1 Messages postés 15 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