Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2758 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  shell unix application de masques...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

shell unix application de masques...

n°1345279
GhostDJ
Posté le 12-04-2006 à 16:58:57  profilanswer
 

salut les gens
alors voila je ne parviens pas à me débrouiller seul, I NEED YOU ! :)
 
ce que je veux faire : dans 2 dossiers differents j'ai des fichiers .txt
je voudrais comparer ces deux dossiers afin de savoir si le AAAUEEE.txt du dossier1 est présent dans le dossier2
la feinte c est que dans le dossier2 il va s'appeler AAATEEE.txt
 
j'ai donc eu l'idée de recourir à des masques : dans un fichier de config j'ai mis  
???U??????;???T??????
 
et j'esperais faire une boucle ou pour une variable $i=AAAUEEE.txt
 
ls $i | sed s/$i/???T???????/g >fic_resultat
 
et hop fic_resultat=AAATEEE.txt
 
sauf que sed il aime pas les "?" :p
 
et donc ca marche pas
 
quelqu'un aurait-il une idée ???  
 
peut etre avec "tr" ? je ne trouve pas
 
 
et bien sûr le masque peut changer je ne peux donc pas m'amuser à faire un cut puis une concaténation, ou alors il faudrait d'abord qu'avec une autre fonction je puisse compter le nb de "?" pour faire mon cut au bon endroit
 
enfin voila c la galere... :sweat:  
 
 

mood
Publicité
Posté le 12-04-2006 à 16:58:57  profilanswer
 

n°1346271
GhostDJ
Posté le 13-04-2006 à 16:52:57  profilanswer
 

la grosse galere, je compare le nom de fichier avec mon modele en mettant chaque caractere dans un tableau ( $tab1[$b] )
par contre je pige pas pourquoi ca plante là : ?: syntax error
if [[ $tab1[$b] -eq '?' ]]
then

n°1346389
Sve@r
Posté le 13-04-2006 à 19:13:02  profilanswer
 

GhostDJ a écrit :

la grosse galere, je compare le nom de fichier avec mon modele en mettant chaque caractere dans un tableau ( $tab1[$b] )
par contre je pige pas pourquoi ca plante là : ?: syntax error
if [[ $tab1[$b] -eq '?' ]]
then


L'option "-eq" de "test" est faite pour vérifier une égalité numérique
 
Si tu veux faire une égalité littérale, faut utiliser "="


Message édité par Sve@r le 13-04-2006 à 19:13:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1346402
Sve@r
Posté le 13-04-2006 à 19:28:22  profilanswer
 

GhostDJ a écrit :

la feinte c est que dans le dossier2 il va s'appeler AAATEEE.txt
 
j'ai donc eu l'idée de recourir à des masques : dans un fichier de config j'ai mis  
???U??????;???T??????
 
et j'esperais faire une boucle ou pour une variable $i=AAAUEEE.txt
 
ls $i | sed s/$i/???T???????/g >fic_resultat
 
et hop fic_resultat=AAATEEE.txt
 
sauf que sed il aime pas les "?" :p


En fait, "sed" est l'éditeur en ligne de "ed" qui est la base de "vi". Mais le caractère "?" signifiant "n'importe quoi" est un métacaractère shell et non sed.
En fait, il faudrait en sed faire un truc de ce style
echo $i |sed -e "s/\(.\)\(.\)\(.\)U\(.\)\(.\)/\1\2\3T\4\5/g" => impossible à mettre en oeuvre
 

GhostDJ a écrit :

peut etre avec "tr" ? je ne trouve pas


tr si la lettre à remplacer "U" n'est pas à un endroit où il ne faudrait pas la remplacer, c'est possible
i=`echo $i |tr 'U' 'T'`
 

GhostDJ a écrit :

et bien sûr le masque peut changer je ne peux donc pas m'amuser à faire un cut puis une concaténation, ou alors il faudrait d'abord qu'avec une autre fonction je puisse compter le nb de "?" pour faire mon cut au bon endroit


Je comprends...
 

GhostDJ a écrit :

enfin voila c la galere... :sweat:


Si la solution "tr 'U' 'T'" ne convient pas, je chercherai ailleurs. C'est un pb intéressant...

Message cité 1 fois
Message édité par Sve@r le 13-04-2006 à 19:32:41

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1350168
skyofdiamo​nds
Posté le 20-04-2006 à 01:13:19  profilanswer
 

Sve@r a écrit :

En fait, "sed" est l'éditeur en ligne de "ed" qui est la base de "vi". Mais le caractère "?" signifiant "n'importe quoi" est un métacaractère shell et non sed.
En fait, il faudrait en sed faire un truc de ce style
echo $i |sed -e "s/\(.\)\(.\)\(.\)U\(.\)\(.\)/\1\2\3T\4\5/g" => impossible à mettre en oeuvre
 
 
tr si la lettre à remplacer "U" n'est pas à un endroit où il ne faudrait pas la remplacer, c'est possible
i=`echo $i |tr 'U' 'T'`
 
 
Je comprends...
 
 
Si la solution "tr 'U' 'T'" ne convient pas, je chercherai ailleurs. C'est un pb intéressant...


 
parce que les masques n existent pas sous unix (on préfère les patterns ou les regex)
 
si on veut s obstiner sur les masques , pas d espoir avec les commandes , il faut scripter :
 

Code :
  1. # i contient le nom de fichier
  2. i=AAAUEEE.txt
  3. # j contient le masque à appliquer
  4. mask=???T??????
  5. ls $i | nawk -v s_mask=$mask '{
  6. s_file=$1
  7. # on traduit la chaine de caracteres en tableau de caracteres
  8. split(s_file,t_file,"" )
  9. split(s_mask,t_mask,"" )
  10. # puis on teste en parcourant le tableau du masque
  11. # quels indices sont "?"
  12. for (i=1; i<= length(s_mask) ; i++  ) {
  13.         if ( "?" == t_mask[i] ) {
  14.                 result=sprintf("%s%s",result,t_file[i])
  15.         }
  16.         else {
  17.                 result=sprintf("%s%s",result,t_mask[i])
  18.         }
  19. }
  20. print result
  21. }'
  22. fi


 
déçu ?
 
 
je fairais quelques remarques :
 
qu est ce qu il faut qu il se passe si le masque et le nom de fichier sont de taille différentes ? c est le cas de l exemple que vous donnez:
le fichier contient 11 caracteres et le masque 10 caracteres
( qui a priorité sur l autre ?)
 
vous utiliseriez les regex cela serait :
 
ls  $i |sed -e "s/\(.\{3\}\)U\(.*\)/\1T\2/"
 
je décompose :
s pour substituer comme d habitude
\(.\{3\}\)U\(.*\) forme la 1ère partie de substitution (c est la réponse à qu est ce qu on doit remplacer ?)
\1T\2 forme la 2ème partie de substitution (c est la réponse à par quoi on doit remplacer ?)
 

  • dans la 1ère partie

\(.\{3\}\) forme le 1er groupe , on forme un groupe en l' entourant de \( et \)
la formation d un groupe est nécessaire pour pouvoir en faire référence dans la 2éme
partie de la substitution
 
U c est une lettre qui est dans votre fichier d origine
 
\(.*\) c est le 2ème groupe qu on référencera aussi dans la 2éme
partie de la substitution
 
dans le 1er groupe :
.\{3\} : c est 3 caractères quelconques qui se suivent
dans le 2ème groupe :
.* : c est 0, 1.. 10.. 1000. ... caractères quelconques  qui se suivent
 

  • dans la 2ème partie


\1 : celaveut dire que vous recopiez le 1er groupe dans la chaine de destination
T vous rajoutez la lettre T dans la chaine de destination
\2 : vous rajoutez le 2ème groupe tel quel
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  shell unix application de masques...

 

Sujets relatifs
Comment déboguer une application distante?SCRIPT SHELL
[Résolu]Comment activer une application Excel qui change de nomApplication perso sur Palm Zire 31 ?
[C / Unix] Recuperer un evenement clavier en mode console[UNIX - SHELL] Définition du prompt en ksh
navigateur pas configuré pour éxecuter cette application java?Votre avis sur notre application de e-learning
Faire un script shell sous Unix 
Plus de sujets relatifs à : shell unix application de masques...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR