Rechercher caracteres ascii etendus dans un fichier

Fermé
yakitori1 Messages postés 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024 - 19 nov. 2013 à 16:31
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 - 3 déc. 2013 à 15:42
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 20/11/2013 à 08:41
hello
essayer
tr -d "\200-\377" < fichier
1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
19 nov. 2013 à 16:59
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
Modifié par yakitori1 le 19/11/2013 à 17:21
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
19 nov. 2013 à 18:16
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
Modifié par yakitori1 le 19/11/2013 à 19:15
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
25 nov. 2013 à 17:23
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
27 nov. 2013 à 12:20
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
26 nov. 2013 à 12:06
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
27 nov. 2013 à 10:40
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
27 nov. 2013 à 12:29
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 27/11/2013 à 12:33
test
0
yakitori1 Messages postés 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
27 nov. 2013 à 12:32
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 27/11/2013 à 12:41
le forum supprime ma commande !!
essayer de remplacer -F "" '{x= par 'BEGIN{FS=""} {x=
essayer aussi avec nawk
0
yakitori1 Messages postés 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
27 nov. 2013 à 13:01
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 27/11/2013 à 13:51
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 27/11/2013 à 14:29
awk Solaris ne comprend peut-être pas FS=""
0
yakitori1 Messages postés 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
27 nov. 2013 à 16:22
encore mais ça ne marche pas
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
27 nov. 2013 à 16:26
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
Modifié par yakitori1 le 28/11/2013 à 07:47
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 28/11/2013 à 08:18
pas toll mais tollé
il faut tester avec un caractère étendu
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
27 nov. 2013 à 15:57
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 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
28 nov. 2013 à 07:48
il ne fait rien comme si il manquait un paramètre
0
dubcek Messages postés 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
Modifié par dubcek le 28/11/2013 à 08:16
un message d'erreur ?
qu'affiche la commande
awk 'BEGIN{for(n=0264; n<=0321; n++)printf "\\%o|", n}'
0
yakitori1 Messages postés 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
28 nov. 2013 à 09:32
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 18758 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 24 décembre 2024 5 623
28 nov. 2013 à 10:27
et avec nawk
0
yakitori1 Messages postés 62 Date d'inscription mardi 19 novembre 2013 Statut Membre Dernière intervention 14 avril 2024
28 nov. 2013 à 10:47
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