shell unix application de masques... - Shell/Batch - Programmation
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
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] ) |
L'option "-eq" de "test" est faite pour vérifier une égalité numérique
Si tu veux faire une égalité littérale, faut utiliser "="
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 |
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... |
Si la solution "tr 'U' 'T'" ne convient pas, je chercherai ailleurs. C'est un pb intéressant...
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. |
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 :
|
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 ?)
\(.\{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
\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
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 "?"
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...