#1 Le 31/05/2013, à 22:50
- xavier4811
[Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Bonjour,
Pour mon premier topic, j'ai essayé de trouver un truc bien tordu.
Tout d'abord le contexte, c'est pas Ubuntu :
$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ lsb_release -a
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: OracleServer
Description: Oracle Linux Server release 6.4
Release: 6.4
Codename: n/a
$ sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
J'ai plusieurs fichiers avec une ligne sous la forme :
Release: 2%{?dist}
pour les quels je cherche comment incrémenter le n° de version dans un script, si possible avec sed -i pour éviter de passer par un fichier temporaire.
J'ai bien une solution crade qui consiste en :
$ while read line; do if [[ $(grep "^Release" <<< $line) ]]; \
then value=`expr $(awk -F" +|%" '{ print $2 }' <<< $line) + 1`; \
echo -e "${line/[0-9]?/${value}}"; else echo $line; fi; \
done < nss.spec > nss_tmp.spec
$ mv nss_tmp.spec nss.spec
mais j'aimerais trouver autre chose. Mon ami DDG m'a orienté vers quelques trucs comme :
$ sed -r 's/\(^Release:[[:blank:]]\{1,\}\)\([[:digit:]]\{1,\}\)\(.*\)/\1$((\2+1))\3/' nss.spec
sed: -e expression n°1, caractère 74: référence \3 invalide dans le côté droit de la commande `s'
ou
$ sed 's/\(^Release:[[:blank:]]\{1,\}\)\([[:digit:]]\{1,\}\)\(.*\)/\1$((\2+1))\3/' nss.spec
...
Release: $((2+1))%{?dist}
...
pas moyen de trouver la bonne syntaxe pour passer de
Release: 2%{?dist}
# à
Release: 3%{?dist}
Evidemment, la version est variable, c'est pas toujours 2 -> 3 et ça peut être sur 1 ou 2 chiffres.
Si quelqu'un a une idée, merci d'avance
Dernière modification par xavier4811 (Le 01/06/2013, à 06:49)
Hors ligne
#2 Le 01/06/2013, à 03:14
- Postmortem
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Salut,
Un sed mais qui ne fonctionne que s'il n'y a qu'un chiffre :
sed -i '/Release: [0-9]%{?dist}/ y/012345678/123456789/' fichier
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#3 Le 01/06/2013, à 04:12
- xavier4811
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Merci du tuyau mais ça n'ira pas forcément puisque j'ai quelques releases supérieures a 9.
Je continue de chercher.
EDIT: doit y avoir moyen d'en tirer qqchose avec x,h&g..
Dernière modification par xavier4811 (Le 01/06/2013, à 05:38)
Hors ligne
#4 Le 01/06/2013, à 06:25
- nesthib
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Tu incrémentes ton numéro de version de 0,1 à chaque fois ?
awk '/Release/{print $2+.1}' < <(lsb_release -a 2>/dev/null)
Pour gérer les numéros du genre 1.9 < 1.10 < 1.11 :
awk -F '[\t.]' '/Release/{print $2"."$3+1}' < <(lsb_release -a 2>/dev/null)
Après tu as compris le principe, il est possible d'automatiser le passage d'un numéro à l'autre de la manière qui te plaît (12.9 < 13 ; 12.42 < 13.0 ; …), il te suffit d'ajouter un ou deux tests.
N=0.0
while true
do
N=$(awk -F '.' '{if ($2<12){print $1"."$2+1} else {print $1+1".0"}}' <<<$N)
echo $N ; sleep .1
done
(boucle, echo et sleep ne sont là que pour faire la démonstration)
Dernière modification par nesthib (Le 01/06/2013, à 06:39)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 01/06/2013, à 06:37
- xavier4811
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
@ nesthib : De 1 a chaque fois.
En fait j'ai été chercher très loin pour rien.
$ grep "^Release" nss.spec
Release: 12%{?dist}
$ value=$(expr $(sed -n '/^Release:/ s/\(^Release:[[:blank:]]\{1,\}\)\([0-9]\{1,\}\)\(.*\)/\2/p' nss.spec) + 1)
$ sed -i '/^Release:/ s/\(^Release:[[:blank:]]\{1,\}\)\([0-9]\{1,\}\)\(.*\)/\1'${value}'\3/' nss.spec
$ grep "^Release" nss.spec
Release: 13%{?dist}
J'aurai quand même préféré le faire sur une seule ligne mais bon.
Hors ligne
#6 Le 01/06/2013, à 06:40
- nesthib
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Je t'ai ajouté un exemple pour incrémenter à deux niveaux.
NB. si possible laisse tomber grep (sed '/…/commande' ou awk '/…/commande font très bien l'affaire), laisse tomber expr et fais tes calculs dans awk.
Dernière modification par nesthib (Le 01/06/2013, à 06:42)
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#7 Le 01/06/2013, à 06:47
- xavier4811
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Oui merci, je viens d'y repenser
# Original
$ grep "^Release" nss.spec
Release: 12%{?dist}
$ value=$(awk -F" +|%" '/^Release/ { $2++; print $2 }' nss.spec)
# edit : et même en plus court
$ value=$(awk -F" +|%" '/^Release/ { print ++$2 }' nss.spec)
$ sed -i '/^Release:/ s/\(^Release:[[:blank:]]\{1,\}\)\([0-9]\{1,\}\)\(.*\)/\1'${value}'\3/' nss.spec
# résultat
$ grep "^Release" nss.spec
Release: 13%{?dist}
Dernière modification par xavier4811 (Le 01/06/2013, à 07:08)
Hors ligne
#8 Le 01/06/2013, à 07:05
- nesthib
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Juste une petite astuce pour raccourcir ta ligne. À la place de :
awk … { $2++; print $2 }' …
tu peux faire :
awk … { print ++$2 }' …
$2++ ne fonctionnera pas car l'incrément sera fait après l'affichage.
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#9 Le 01/06/2013, à 07:09
- xavier4811
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
J'avais pas fais attention a ça, c'est corrigé, merci encore pour les tuyaux.
Hors ligne
#10 Le 03/06/2013, à 11:57
- Compte anonymisé
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Je n'ai vraiment pas tout suivi, tout compris, mais à toutes fins utiles:
seq 0.0 0.1 10
for I in `seq 0.0 0.1 10`; do echo Monfichier-${I}-toto; done
Dernière modification par Compte anonymisé (Le 03/06/2013, à 12:13)
#11 Le 03/06/2013, à 15:24
- nesthib
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Ça n'est pas vraiment la question φlip…
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#12 Le 03/06/2013, à 15:31
- Compte anonymisé
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Je voyais pourtant un rapport évident avec ça:
N=0.0
while true
do
N=$(awk -F '.' '{if ($2<12){print $1"."$2+1} else {print $1+1".0"}}' <<<$N)
echo $N ; sleep .1
done
Je trouvais seq plus simple...
Mais désolé de ne pas avoir tout décodé (ça dépasse mes limites).
#13 Le 04/06/2013, à 01:33
- nesthib
Re : [Résolu] Bash, Sed, incrémenter un n° de version dans un fichier
Ma boucle était juste là pour l'exemple avec le awk (comme je le mentionne dans le message), en pratique la valeur est lue dans un fichier puis incrémentée. Bien sûr que s'il fallait la générer entre des bornes connues il serait plus simple de passer par seq ou {a..b}
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne