Afin de me faciliter la tâche lorsque je génère un projet à partir d'un template, j'ai écrit un script qui recherche dans les fichiers toutes les occurrences de gimp-plugin-template et les remplace par la valeur du paramètre -n entré en argument du script:
#!/bin/bash
# Set variables
pluginName=""
############################################################
# Help #
############################################################
HelpMe()
{
# Display Help
echo "Add description of the script functions here."
echo
echo "Syntax: create-plug-in [-h] -n name"
echo "options:"
echo "h Print this Help."
echo "n name of the plug-in."
echo
}
############################################################
# Run #
############################################################
Run()
{
mkdir $pluginName
cp -a Template/. $pluginName
cd $pluginName
source="'gimp-plugin-template'"
target="'s/gimp-plugin-template/$pluginName/g'"
grep -RiIl $source | xargs sed -i $target
source=${source//-/_}
target=${target//-/_}
first=${first/Suzy/$second}
grep -RiIl $source | xargs sed -i $target
cd ..
echo "Plugin: "$pluginName" created."
}
############################################################
# Main program #
############################################################
############################################################
# Process the input options. Add options as needed. #
############################################################
# Get the options
while getopts ":hn:" option; do
case $option in
h) # display Help
HelpMe
exit;;
n) # run commands
pluginName=$OPTARG
Run
exit;;
\?) # Invalid option
echo "Error: Invalid option"
exit;;
esac
done
Malheureusement, lorsque j'exécute, j'obtiens ceci:
Pourquoi mets-tu des ' dans les chaînes ? En bash l'utilisation des variables doit se faire dans des doubles quotes pour éviter que l’interpréteur fasse une expansion du contenu, mais il ne faut pas ajouter des quotes dans les chaînes.
source="gimp-plugin-template"
target="s/gimp-plugin-template/$pluginName/g"
grep -RiIl "$source" | xargs -d'\n' sed -i "$target" # ajout de -d'\n' pour éviter des problèmes avec des chemins contenant des espaces
source=${source//-/_}
target=${target//-/_}
grep -RiIl "$source" | xargs -d'\n' sed -i "$target"
# ajout de -d'\n' pour éviter des problèmes avec des chemins contenant des espaces
sachant qu'un nom de fichier, sur Linux, peut contenir n'importe quel caractère à part NULL, je proposerais plutôt
grep -RilZ "$motif" | xargs --no-run-if-empty --null sed -i 's/'"$motif"'/'"$substitution"'/g'
je me demande si, en bash, on ne pourrait pas se passer de grep|xargs, en passant par globstar (et nullglob, bien sûr ).
edit : « script shell » ? tu n'as pas plus précis à dire pour permettre à ceux qui auront le même souci de trouver ta discussion, et probablement une solution ?!
- Edité par dantonq 8 février 2023 à 23:10:50
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Sauf que le problème ne se situe pas dans la fonction principale qui prend en charge les paramètres, mais dans la fonction Run(). Mais si tu y tiens, voici ma ligne de commande:
./create-plugin.sh -n sample
Avec: create-plugin.sh: Le nom du script sample: un nom quelconque.
Le but est de copier le contenu du dossier template dans un noouveau dossier nommé d'après le nom suivant le paramètre -n (sample dans mon cas), et substituer ce nom à gimp-plugin-template et gimp_plugin_template dans tous les fichiers du dossier et sous dossiers nouvellement créés.
ce paramètre est utilisé dans Run(), c'est pour ça que je demande.
heu... tu n'utilises pas $motif et $substitution telles quelles n'est-ce pas ? ce sont des noms évocateurs de ce que les variables doivent contenir, mais elles n'ont pas été définies ! et forcément, sed ne comprend pas quoi faire.
PS : $second n'est pas défini, donc Suzy sera remplacé par rien; peu importe, tu n'utilises pas first.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Ca a fini par fonctionner (je ne sais pas comment).
Run()
{
mkdir $pluginName
cp -a Template/. $pluginName
cd $pluginName
motif="gimp-plugin-template"
substitution=$pluginName
#remplace les underscore eventuels par des tirets
substitution=${substitution//_/-}
grep -RilZ "$motif" | xargs --no-run-if-empty --null sed -i 's/'"$motif"'/'"$substitution"'/g'
#remplace les tirets par des underscore
motif=${motif//-/_}
substitution=${substitution//-/_}
grep -RilZ "$motif" | xargs --no-run-if-empty --null sed -i 's/'"$motif"'/'"$substitution"'/g'
cd ..
echo "Plugin: "$pluginName" created."
}
Il y a des sources écrits en différent langages derrière, certains supportent les tiret, d'autre les underscore. (ce ne sont que des vulgaires détails d'implémentation).
parce que je trouve bizarre de faire deux manipulations quand une seule suffit.
Run()
{
mkdir "$pluginName" #toujours des guillemets autour des Développement de paramètres
cp -a /cheminAbsolu/Template/. "$pluginName" #indiquer les chemins absolus, pour éviter cd
motif="gimp[-_]plugin[-_]template" #motif avec - OU _
substitution=$pluginName #ne sert pas à grand chose, mais bon
#ligne de commandes sur plusieurs lignes pour la lisibilité
grep -RilZ "$motif" "$pluginName"/ \
| xargs -r -0 \
sed -i '/'"$motif"'/{
s/-/_/g;
s/'"$motif"'/'"$substitution"'/g}'
printf 'Plugin: %s created.' "$pluginName" #en espérant que tout se soit bien passé
}
ça devrait marcher aussi bien, en étant plus simple (en respectant le KISS principle).
- Edité par dantonq 9 février 2023 à 16:51:52
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
je t'ai montré qu'une seule substitution est nécessaire : soulignements -> tirets + tirets -> soulignements = tirets -> soulignements je ne comprends pas que tu ne le voies pas.
motif est maintenant « mot [- OU _] mot [- OU _] mot »
NB: j'ai peut-être fait une erreur, il faudrait inverser :
sed -i '/'"$motif"'/{
s/'"$motif"'/'"$substitution"'/g;
s/-/_/g;
}'
sans fichier modèle, rédiger une commande sed est un peu abstrait.
- Edité par dantonq 9 février 2023 à 20:02:01
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
je te l'ai montré, tu n'es pas capable de l'admettre.
allez, j'essaie encore une fois avec des billes de couleurs :
quand dans un sac de billes, tu remplaces toutes les rouges par des bleues (alors, il n'y a plus que des bleues) puis toutes les bleues par des rouges (alors, il n'y a plus que des rouges)
c'est comme si tu avais remplacé directement, uniquement et simplement, toutes les billes bleues par des billes rouges.
après tes deux opérations, comme après la seule mienne, à la fin, il n'y a plus que des billes rouges dans le sac !
- Edité par dantonq 10 février 2023 à 1:52:50
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
tu as l'air d'avoir compris, mais, moi, l'intérêt de faire rouges->bleues+bleues->rouges (dans les remplacements de paramètres shell) au lieu de bleues->rouges m'échappe encore. saurais-tu me l'expliquer, s'il te plaît ?
au moins, il n'y a plus qu'une seule commande sed, et ça c'est bien.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Au risque de me répéter, je doit remplacer 2 chaînes de caractère différentes.
Elles se ressemblent, c'est ce qui doit te perturber.
Si tu préfères, quelque soit l'entrée, par exemple: rouge+bleu+rouge, je doit faire une substitution avec rouge+rouge+rouge et une substitution avec bleu+bleu+bleu
je le comprendrais si ce n'était pas fait dans un même fichier, ou si les éléments à remplacer étaient différents*. dans le cas présenté, la dernière substitution annule la précédente.
j'ai essayé de simplifier autant que possible mes explications pour mettre en évidence l'inutilité de la manœuvre.
montrez-moi, avant, pendant (si ça vous amuse), mais surtout après, que le résultat final est différent de la dernière substitution, je comprendrai peut-être.
ah, quand ça veut pas, ça veut pas.
- Edité par dantonq 10 février 2023 à 17:45:57
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
> tu as l'air d'avoir compris, mais, moi, l'intérêt de faire rouges->bleues+bleues->rouges (dans les remplacements de paramètres shell) au lieu de bleues->rouges m'échappe encore.
saurais-tu me l'expliquer, s'il te plaît ?
Qui a dit que pluginName n'avait pas d'underscore à la base ? Franchement, je ne vois pas le problème à faire abstraction du caractère utilisé et ne pas se prendre la tête lorsqu'on écrit le nom du plugin.
Script shell - substitution dans plusieurs fichier
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
ça devrait marcher aussi bien, en étant plus simple (en respectant le KISS principle).
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique