shell unix application de masques...

shell unix application de masques... - Shell/Batch - Programmation

Marsh Posté le 12-04-2006 à 16:58:57    

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:  
 
 

Reply

Marsh Posté le 12-04-2006 à 16:58:57   

Reply

Marsh Posté le 13-04-2006 à 16:52:57    

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

Reply

Marsh Posté le 13-04-2006 à 19:13:02    

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.
Reply

Marsh Posté le 13-04-2006 à 19:28:22    

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.
Reply

Marsh Posté le 20-04-2006 à 01:13:19    

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
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed