Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 05-04-2014 11:03:13

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

[résolu]expressions rationnelles et bash

Bonjour
j'aurai une question vraiment simple :

comment on utilise les expressions rationnelles avec bash ?

Par exemple pour la substitution j'ai un message d'erreur pour :


#!/bin/bash
v=voiture
$v =~ s/^w+/^w+\.txt
echo $v
 



Le but étant de représenter la valeur de la variable v pour pouvoir transformer sa valeur simplement par l'ajout ".txt".

En fait je souhaiterais savoir comment utiliser l'expression ci-dessus pour trouver un équivalent d'une substitution de variable du genre :


#!/bin/bash
v=voiture
echo ${v//*/voiture.txt}
 



Quand j'essaie de faire ainsi :


#!/bin/bash
v=voiture
echo ${v//[^\w+]/[^\w+\.txt]}
 




j'ai le retour :


Dossier essai-c Modèles Musique
 



Il me lance une recherche sur mon répertoire personnel, au lieu de transformer la valeur de v.

Merci d'avance  smile

Dernière modification par Hypathie (05-04-2014 18:01:25)

Hors ligne

#2 05-04-2014 12:30:14

LeDub
Membre
(G)UI : XFCE
Inscription : 18-02-2014

Re : [résolu]expressions rationnelles et bash

Bonjour,

Pourquoi faire simple quand on peut faire compliqué ?
Pour ton problème, moi, je ferais :


V=voiture
echo ${V}.txt
 



LeDub simple voire simplet !!!

Hors ligne

#3 05-04-2014 17:02:58

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

Merci LeDub smile

Finalement, je crois comprendre qu'on ne peut pas faire des substitutions de variable avec les expressions rationnelles sans sed sad

En fait je me servais de echo pour voir, mais le but était me servir de ça pour changer tous noms de fichiers en alphanumériques d'un répertoire : je voulais trouver une méthode avec expressions rationnelles pour faire, sur cela :


mkdir ~/DirTest && cd ~/DirTest && touch Janvier Fevrier Mars Avril Mai Juin && cd ~
 



ceci :


#!/bin/bash
cd /home/hypathie/DirTest/
declare -a fichiers=( $(ls) )
echo ${fichiers[@]}
 
# parcourir tous les paramètres du tableau avec une boucle
 
for i in "${fichiers[@]}"
do
   echo "$i"
# changer les paramètres du tableau (=noms des fichiers)
  mv "$i" "$i.txt"
  echo "$i.txt"
 
done
 



Ça fonctionne :


Avril Fevrier Janvier Juin Mai Mars
Avril
Avril.txt
Fevrier
Fevrier.txt
Janvier
Janvier.txt
Juin
Juin.txt
Mai
Mai.txt
Mars
Mars.txt
 



Mais je cherche une méthode équivalente avec les substituions de type :


${paramètre//motif/chaîne}
 



à la place de l'avant dernière ligne avec" mv" avec une expression rationnelle

Mais je sèche complètement !  sad

Dernière modification par Hypathie (06-04-2014 06:18:10)

Hors ligne

#4 05-04-2014 17:03:49

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]expressions rationnelles et bash

Plop,

Pour ton exemple, j'aurais effectivement fait comme LeDub smile

Mais pour répondre à ta question de manière générale :

#!/bin/sh
v="voiture"
v=$(echo $v | sed 's/.\+/&.txt/')
echo $v
 



En plus, en passant par sed, c'est POSIX smile


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#5 05-04-2014 17:05:14

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

msgs croisés captnfab wink

donc merci smile

Hors ligne

#6 05-04-2014 17:09:26

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

atta maintenant que j'ai vu "sed", j'aimerais trouver sur l'exemple concret....


...

mv $i $(echo $i | sed 's/.\+/&.txt/')
 




tu crois que ... ça marcherait. Bon,  je vais essayer ça roll

Hors ligne

#7 05-04-2014 17:15:54

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]expressions rationnelles et bash

Hypathie a écrit :


#!/bin/bash
cd /home/hypathie/DirTest/
declare -a fichiers=( $(ls) )
echo ${fichiers[@]}
 
# parcourir tous les paramètres du tableau avec une boucle
 
for i in "${fichiers[@]}"
do
   echo "$i"
# changer les paramètres du tableau (=noms des fichiers)
  mv "$i" "$i.txt"
  echo "$i.txt"
 
done
 



Simplement pour te donner la version POSIX puisque les bashismes (declare -a) ne sont pas nécessaires ici :

#!/bin/sh
set +eu
cd "/home/hypathie/DirTest/"

for i in *
do
   echo "$i"
   mv "$i" "$i.txt"
   echo "$i.txt"
done
 



Et la version sans « cd »

#!/bin/sh
set +eu
D="/home/hypathie/DirTest/"

for i in "$D/"*
do
   F=$(basename "$i")
   echo "Déplacement de $F dans $D en $F.txt"
   mv "$i" "$i.txt"
done



Pourquoi une version sans « cd » ? Parce que si tu ne mets pas de « set +e », si le «cd» échoue, le programme continue… et tu ne voudrais probablement pas qu'il renomme tous les fichiers de ton home…

Exemple :

#!/bin/sh
cd /tmp/cedossiernexistepas
for i in *; do echo "rm -i $i"; done


Tu imagines ce que ça donnerait sans le echo smile


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#8 05-04-2014 18:00:40

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

yep,

ça me fait plein de méthodes smile

donc juste pour finir sur l'idée de départ (avec tableau for et expression rationnelle), oui ça marche (promis, je me "posixise" bientôt) big_smile



#!/bin/bash
#mkdir ~/DirTest2  #pour faire des essais
cd /home/hypathie/DirTest2/
#touch Juillet Aout Septembre Octobre Novembre Decembre #pour faire des essais
declare -a fichiers=( $(ls) )
echo ${fichiers[@]}

# parcourir tous les paramètres du tableau avec une boucle

for i in "${fichiers[@]}"
do
   echo "$i"
# changer les paramètres du tableau (=noms des fichiers)
   mv "$i" "$(echo $i | sed 's/.\+/&.txt/')"
done
ls ~/DirTest2
 



qui donne :


Aout Decembre Juillet Novembre Octobre Septembre
Aout
Decembre
Juillet
Novembre
Octobre
Septembre
Aout.txt  Decembre.txt  Juillet.txt  Novembre.txt  Octobre.txt  Septembre.txt
 



(le "ls" ce n'est pas la version sans echo : oui j'imagine bien ... ) big_smile

Merci encore  smile

Hors ligne

#9 05-04-2014 18:19:36

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]expressions rationnelles et bash

Yep, ça roule smile

Encore une chose.
Ton mkdir, il va marcher la première fois, mais renvoyer une erreur la seconde puisque le dossier existe, et donc, si le «set +e» est bien mis comme il le devrait, le programme s'arrêtera là.
Si ça n'est pas le comportement souhaité, tu peux utiliser « mkdir -p » plutôt que mkdir. Ce dernier ne renverra pas d'erreur si le dossier existe.

Je suis lourd, mais je le répète : pour bien apprendre (et bien écrire) les scripts shell, « set +eu » me semble obligatoire en début de chaque script (en dessous du #!) smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#10 05-04-2014 18:50:56

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

oui pardon, je mets un # devant quand ça m'arrange, mais par flemme, pour faire des essais ... oupsss big_smile

Par contre j'ai testé les codes et ça ne marche pas chez moi sad
Ça me donne le retour :


mv: impossible d'évaluer « * »: Aucun fichier ou dossier de ce type
*.txt
 



Exactement le même retour pour la version avec cd et sans cd

Zut alors ça peut venir de quoi ?

Hors ligne

#11 05-04-2014 18:57:50

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]expressions rationnelles et bash

Ah, zut, à vouloir mettre trop de guillemets… l'étoile ne doit pas être entre guillemets. J'ai corrigé smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#12 05-04-2014 19:02:53

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

Non erreur de ma part, pour la version sans cd, le retour est :


Déplacement de * dans /home/hypathie/DirTest/ en *.txt
mv: impossible d'évaluer « /home/hypathie/DirTest//* »: Aucun fichier ou dossier de ce type
 



On dirait que mon shell à trop bu ! C'est quoi encore ces signes "é" !   yikes
J'ai fait du copier/coller des codes de #7 en laissant "#!/bin/bash" mais je ne crois pas que ça peut venir de là ?

smile

Hors ligne

#13 05-04-2014 19:11:59

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

Oui merci j'ai vérifié, smile
mais par contre, mon système doit avoir un problème.

C'est visible pour le code sans cd qui me donne le retour :


Déplacement de Avril dans /home/hypathie/DirTest/ en Avril.txt
Déplacement de Fevrier dans /home/hypathie/DirTest/ en Fevrier.txt
Déplacement de Janvier dans /home/hypathie/DirTest/ en Janvier.txt
Déplacement de Juin dans /home/hypathie/DirTest/ en Juin.txt
Déplacement de Mai dans /home/hypathie/DirTest/ en Mai.txt
Déplacement de Mars dans /home/hypathie/DirTest/ en Mars.txt
 



C'est inquiétant ? 

Vaut-il mieux que j'ouvre un autre fil pour cela ?

(pour les noms j'en ai mis d'autres que pour les autres postes)

Hors ligne

#14 05-04-2014 19:23:04

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]expressions rationnelles et bash

Sans l'accent aigu sur déplacement tout va bien :


Deplacement de Avril dans /home/hypathie/DirTest/ en Avril.txt
Deplacement de Fevrier dans /home/hypathie/DirTest/ en Fevrier.txt
Deplacement de Janvier dans /home/hypathie/DirTest/ en Janvier.txt
Deplacement de Juin dans /home/hypathie/DirTest/ en Juin.txt
Deplacement de Mai dans /home/hypathie/DirTest/ en Mai.txt
Deplacement de Mars dans /home/hypathie/DirTest/ en Mars.txt
 



Donc plus de problème, même si c'est un peu bizarre : avec le "  " d'habitude l'accent passe !

smile

Hors ligne

#15 05-04-2014 19:57:17

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]expressions rationnelles et bash

Pour les accents, il faut faire attention que l'encodage de l'accent soit cohérent avec l'encodage du fichier et que ce dernier soit cohérent avec l'encodage du système smile
Si ton fichier est bien en UTF-8, que ton système aussi et que tu as tapé l'accent à la main avec ton clavier, il ne devrait pas y avoir de problème.

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

Pied de page des forums