Rechercher : dans
Par :

/sed/ & VARIABLE script challenge

Dernière réponse le 10 jun 2009 à 18:14:13 m4ni4k, le 8 jun 2009 à 20:11:22 
 Signaler ce message aux modérateurs

Bonjour,

Je me suis concocté un petit script qui fonctionne honnêtement (en Bourne shell du moins) mais qui est plutôt tiré par les cheveux et qui par conséquent, mérite sont lot de petites retouches.
Voici la chose:

#!/bin/sh
A=/archive.ubuntu.com
read PKG
sudo apt-get update
apt-get -qq --print-uris install $PKG|sed -e 's/'\''//; s/'\''.*//'\
 -e '/ubuntu.com\/u/ s#file:#wget -cNrnH -P'$A' -a'$A'/ubuntu/log_POOL\\\n http:/#'\
 -e '/ubuntu.com\/m/ s#file:'$A'/medibuntu#wget -cNrnH -P'$A'/medibuntu -a'$A'/medibuntu/log_POOL\\\n http://packages.medibuntu.org#'\
 -e '1i\#!/bin/sh\n'"#  Packages amount:\t\t$(apt-get -qq --print-uris install $PKG|sed -n '$=')"''\
 -e "1i$(sed '/^D/!d;s/^Date: ...,/# /' /var/lib/apt/lists/*ease|sed ':a;$!N;s/\n//;ta')\n"|sed '/^# /{s/UTCDescription: /\t/g;s/#/\n&/g}'\
 >/tmp/apt-wget_$PKG.sh && chmod +x "/tmp/apt-wget_$PKG.sh"

Je vous invite donc à me dire en quoi par exemple je pourrais simplifier les 2 dernières actions de sed.
La première devrait pouvoir me renvoyer plus simplement le nombre de ligne sans devoir rappeler la commande apt-get.
Quant à la seconde, je désespère de devoir aplanir sur une seule ligne le résultat de la substitution de commande sed '/^D/!d;s/^Date: ...,/# /' /var/lib/apt/lists/*ease par un sed ':a;$!N;s/\n//;ta' dans un premier temps, pour la redéployer dans un second temps par un sed '/^# /s/#/\n&/g'.

Accessoirement, j'aimerais également savoir quelle est la manière la plus seyante pour imposer à la commande read, ou plus directement à sa variable PKG, des conditions spécifiques telles que la longueur maximale, l'espacement unique entre chacun des motifs, etc.

En vous remerciant d'avance!
Toute remarque étant bienvenue.

Meilleures réponses pour « /sed/ & VARIABLE script challenge » dans :
Sed - Introduction à SED - Part II VoirSED - The Stream EDitor - Part II Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Comment récupérer le résultat d'une commande dans une variable VoirComment récupérer le résultat d'une commande dans une variable Préambule Syntaxe Exemples Préambule Il est bien souvent nécessaire de récupérer le résultat d'une commande (ou de son code retour) dans une variable afin de pouvoir...
Comment lire un fichier ligne par ligne VoirComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
VBScript - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Il s'agit en fait d'une zone de la mémoire réservée pour le stockage d'une valeur. Les...
PHP - Les variables d'environnement VoirNotion de variable d'environnement Les variables d'environnement sont, comme leur nom l'indique, des données stockées dans des variables permettant au programme d'avoir des informations sur son environnement. L'environnement, dans le cas du script...
Javascript - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. En Javascript, les noms de variables peuvent être aussi long que l'on désire,...

1

m4ni4k, le 9 jun 2009 à 18:57:20

Pour fonctionner aussi bien en bash qu'en pur sh:

#!/bin/bash
A=/archive.ubuntu.com
read PKG
sudo apt-get update
W=`apt-get -qq --print-uris install $PKG`
N=`echo "$W"|sed -n '$='`
D=`sed '/^D/!d;s/^Date: ...,/# /' /var/lib/apt/lists/*ease|sed ':a;$!N;s/\n//;ta'`
echo "$W"|sed -e 's/'\''//; s/'\''.*//'\
 -e "/ubuntu.com\/u/ s#file:#wget -cNrnH -P$A -a$A/ubuntu/log_POOL\\\\\n http:/#"\
 -e "/ubuntu.com\/m/ s#file:$A/medibuntu#wget -cNrnH -P$A/medibuntu -a$A/medibuntu/log_POOL\\\\\n http://packages.medibuntu.org#"\
 -e "1i#\!/bin/sh\n#  Packages amount:\t\t$N\n$D\n"|sed '/^# /{s/UTCDescription: /\t/g;s/#/\n&/g}'\
 >/tmp/apt-wget_$PKG.sh && chmod +x "/tmp/apt-wget_$PKG.sh"

Ce qui est plutôt surprenant, c'est que, selon que l'on lance le script en bash ou en sh, le résultat ne sera pas exactement le même.
Essayez vous-même consécutivement en bash puis en sh:
D=`sed '/^D/!d;s/^Date: ...,/# /' /var/lib/apt/lists/*ease|sed ':a;$!N;s/\n//;ta'`;\
echo "$D"|sed '/^# /{s/UTCDescription: /\t/g;s/#/\n&/g}'

L'enseignement à tirer, c'est que de toute évidence, bash et sh n'ont pas la même façon de concevoir le tri!!!
A vrai dire, je ne comprend pas du tout ce que trafique sh!

Répondre à m4ni4k

2

 m4ni4k, le 10 jun 2009 à 18:14:13

Voici la dernière mouture, qui résout essentiellement le problème des espaces entre les noms des packages.
Ceux-ci seront élégamment remplacés par des tirets au moment de l'écriture du fichier:

#!/bin/bash
A=/archive.ubuntu.com
M=/medibuntu
C="wget -cNrnH -P$A"
H="/log_POOL\\\\\n http:/"
read X
sudo apt-get update
P=`apt-get -qq --print-uris install $X`
Q=`echo "$P"|sed -n '$='`
R=`sed '/^D/!d;s/^Date: ...,/# /' /var/lib/apt/lists/*ease|sed ':a;$!N;s/\n//;ta'`
S=${X// /-}
echo "$P"|sed -e 's/'\''//; s/'\''.*//'\
 -e "/\\$A\/u/ s#file:#$C -a$A/ubuntu$H#"\
 -e "/\\$A\/m/ s#file:$A$M#$C$M -a$A$M$H/packages.medibuntu.org#"\
 -e "1i#\!/bin/sh\n#  Packages amount:\t\t$Q\n$R\n"|sed '/^# /{s/UTCDescription: /\t/g;s/#/\n&/g}'\
 >/tmp/apt-wget_$S.sh && chmod +x /tmp/apt-wget_$S.sh

Fonctionne aussi en sh traditionnel à la nuance près qu'il ne faut pas être trop exigeant sur l'ordre dans lequel les données du repertoire /var/lib/apt/lists/ seront triées

Répondre à m4ni4k