Posez votre question Signaler

Script bash - commande sed [Résolu]

djmic 41Messages postés 17 mai 2008Date d'inscription - Dernière réponse le 22 déc. 2009 à 21:37
Bonjour à tous,
Voilà j'ai reçu un exo de la part d'un professeur.
Mais je n'arrive pas à m'en sortir.
Le but du script est de renommer automatiquement les fichiers d'un répertoire donné en argument de telle sorte que le nom des fichiers commence par une majuscule et que le reste soit mis en minuscule MAIS à l'aide de la commande SED
j'ai décidé de faire d'abord par étape.
J'ai donc d'abord décidé de gérer des fichiers sans extension et que des caractères alphabétiques.
if [ $# -eq 0 ];then
echo "Veuillez renseignez le répertoire en paramètre";
elif [ -d $1 ];then
ls $1 | faq/478-sed sed -e 's/[a-zA-Z]+/[A-Z][a-z]*/'
else
echo "Le répertoire n'existe pas";
fi

Le soucis c'est que ca ne fonctionne pas.
Ça ne fait que lister mon répertoire que je passe en argument.
Est ce que quelqu'un pourrait m'aider pour cette commande sed?
Merci
Lire la suite 

Script bash - commande sed »

12 réponses
Réponse
+0
moins plus
Salut,

Voir : http://www.commentcamarche.net/forum/affich-15651662-script-shell-gnu-linux#1
Ajouter un commentaire
Réponse
+0
moins plus
Juste un petit détail, sed ne modifie donc pas directement le nom du fichier???

Il faut le coupler à la commande mv?


Merci
jipicy- 22 déc. 2009 à 13:01
Ben oui.
Ajouter un commentaire
Réponse
+0
moins plus
par contre j'ai un soucis avec la boucle for

Moi ce que je dois faire, ce n'est pas utiliser le répertoire courant mais le répertoire passé en argument?

comment dois-je faire?


for fich in $(find $1 -type d);do

.....


?
personnellement ca ne fonctionne pas.
je fais un echo $fich pour voir s'il parcourt bien mon répertoire
mais il m'affiche le nom de mon répertoire.

merci
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

ceci devrait t'aider :

http://www.partmaps.org/era/unix/award.html#ls
Ajouter un commentaire
Réponse
+0
moins plus
voilà ce que j'ai testé

if [ $# -eq 0];then
echo "Veuillez renseigner le répertoire en paramètre";
elif [ -d $1 ];then
for fich in $1/*;do
mv "$fich" "$(echo $fich | sed 's/[a-zA-Z]+/[A-Z][a-z]*/g')";
done
else
echo "Le répertoire n'existe pas";
fi


il parcourt bien mon répertoire mais j'ai des erreurs au niveau de la commande mv.
sed n'agit pas. sans doute une erreur dans la regex.

je ne gère pas les extensions pour le moment.
Ajouter un commentaire
Réponse
+0
moins plus
jp@MDK:~/tmpfs ssh$ cat foo.sh
#! /bin/sh

#set -xv

for i in rep/sousrep/brol/*
do
rep=$(dirname $i)
fich=$(echo $(basename $i)|sed s'/./\u&/')
mv -v $i ${rep}/${fich}
done

jp@MDK:~/tmpfs ssh$ tree
.
|-- -
|-- foo.sh
`-- rep
    `-- sousrep
        |-- brol
        |   |-- fich1.txt
        |   |-- fich2.txt
        |   `-- fich3.txt
        |-- fich1.txt
        |-- fich2.txt
        `-- fich3.txt

4 directories, 7 files

jp@MDK:~/tmpfs ssh$ ./foo.sh
`rep/sousrep/brol/fich1.txt' -> `rep/sousrep/brol/Fich1.txt'
`rep/sousrep/brol/fich2.txt' -> `rep/sousrep/brol/Fich2.txt'
`rep/sousrep/brol/fich3.txt' -> `rep/sousrep/brol/Fich3.txt'

jp@MDK:~/tmpfs ssh$ tree
.
|-- -
|-- foo.sh
`-- rep
    `-- sousrep
        |-- brol
        |   |-- Fich1.txt
        |   |-- Fich2.txt
        |   `-- Fich3.txt
        |-- fich1.txt
        |-- fich2.txt
        `-- fich3.txt

4 directories, 7 files

jp@MDK:~/tmpfs ssh$

;-))
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour la solution, c'est super.

Mais j'aimerai comprendre un minimum, enfin juste la regex que je n'ai pas compris.
/./\u&/


Le . represente la chaîne entière

mais le \u et le & qui suit?

merci tu m'aides vraiment beaucoup c'est sympa
jipicy- 22 déc. 2009 à 15:42
Le "." (point) représente un caractère, le 1er ici en l'occurrence.

le "\u" est un paramètre avancé dans la partie de substitution (celle de droite) qui permet de mettre le caractère qui suit en majuscule (u comme uppercase. L'anti-slash (\) sert à protéger le "u" afin qu'il soit interprété comme paramètre et non comme un caractère littéral).

Le "&" (esperluette) représente le motif mis en évidence dans la partie de substitution de gauche.

Donc on met en majuscule (\u) la partie mise en évidence (le 1er caractère) représentée par "&".

Tout ça est expliqué dans la FAQ sur sed...
Ajouter un commentaire
Réponse
+0
moins plus
dans ce cas là, on ne travaille que sur la première lettre, on ne vérifie donc pas la présence de majuscule dans le reste de la chaîne (en dehors de la première lettre).

Le tout est de trouver la bonne regex pour le motif de départ et la regex pour le motif de 'transformation' !?
jipicy- 22 déc. 2009 à 17:03
Je n'avais pas bien interprété l'énoncé et n'avais pas vu qu'il fallait mettre la 1ère lettre du nom en majuscule ET le reste en minuscule ;-\

Dans ce cas :

sed 's/\(.\)\(.*\)/\u\1\L\2/'

Ajouter un commentaire
Réponse
+0
moins plus
merci Jicipy, ca fonctionne impeccablement.

Merci de passer du temps à aider les personnes.
Ajouter un commentaire
Ce document intitulé « Script bash - commande sed » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?