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 :
- # i contient le nom de fichier
- i=AAAUEEE.txt
- # j contient le masque à appliquer
- mask=???T??????
- ls $i | nawk -v s_mask=$mask '{
- s_file=$1
- # on traduit la chaine de caracteres en tableau de caracteres
- split(s_file,t_file,"" )
- split(s_mask,t_mask,"" )
- # puis on teste en parcourant le tableau du masque
- # quels indices sont "?"
- for (i=1; i<= length(s_mask) ; i++ ) {
- if ( "?" == t_mask[i] ) {
- result=sprintf("%s%s",result,t_file[i])
- }
- else {
- result=sprintf("%s%s",result,t_mask[i])
- }
- }
- print result
- }'
- 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 ?)
\(.\{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