Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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… wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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} wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne