To /sed/ or not to /sed/

Fermé
m4ni4k - 28 mai 2009 à 13:15
 m4ni4k - 2 juin 2009 à 00:27
Bonjour,

pour obtenir un fichier sources.list comme ceci:

deb file:/archive.ubuntu.com/ubuntu jaunty main restricted universe multiverse
deb file:/archive.ubuntu.com/ubuntu jaunty-security main restricted universe multiverse
deb file:/archive.ubuntu.com/ubuntu jaunty-updates main restricted universe multiverse
deb file:/archive.ubuntu.com/medibuntu jaunty free non-free


D'ordinaire, je me contentais de faire cela:

sudo bash -c 'echo -e "deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n" "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free"|sed ''1!\ s/\ //''>/etc/apt/sources.list'


Mais en réalité, je pourrais presque y arriver plus simplement à l'aide de la commande echo toute seule par l'interpretation du \b

sudo bash -c 'echo -e "\bdeb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n" "\bdeb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free">/etc/apt/sources.list'


Maintenant, ma question est de savoir ce qu'il manque pour qu'echo sauve le texte tel qu'il l'afficherait dans le terminal et non pas en incluant le caractère de backspace + celui qu'il est censé éffacer?

Merci de votre attention!
A voir également:

2 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 mai 2009 à 13:44
Salut,

Je ne comprends pas pourquoi l'utilisation de \n ne te conviens pas.

Tu peux faire la commande
echo -e ".................................." | sudo tee /etc/apt/sources.list
Pense quand même à sauvegarder le fichier sources.list d'origine
0
Hélas, j'avais déjà essayé avec tee en espérant, sans trop vraiment y croire, qu'il se comporte légèrement différemment que >.

Ce qui me rend dingue c'est de se sentir si désarmé face au fait que:
<code/>echo -e "deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n" "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free"|sed '1! s/ //'</code>
ou:
echo -e "\bdeb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n" "\bdeb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free"

donnent exactement le même résultat à l'écran, mais s'enregistrent différemment dans un fichier.
C'est plutôt particulier non?
Et, même si je comprends qu'il puisse y avoir un vague intérêt à l'enregistrer de cette manière là, j'aimerais quand même pouvoir trouver ce moyen de filtrer à la sortie d'echo, le backspace plus le caractère qu'il concerne.



Voila tout!
0
m4ni4k > m4ni4k
28 mai 2009 à 14:26
echo -e "deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n" "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free"|sed '1! s/ //'

ou:
echo -e "\bdeb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n" "\bdeb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free"

donnent exactement le même résultat à l'écran, mais s'enregistrent différemment dans un fichier.

C'est mieux comme ça!
0
voici ce qui semble le plus universel et qui du coup me conviendra le mieux pour l'instant.
C'est encore trop sophistiqué à mon goût, mais c'est quand même plus conventionnel:
sudo sh -c '{ printf "deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`%s main restricted universe multiverse\n" "" -security -updates;printf "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free\n"; } >/etc/apt/s.list'

Ca m'énerve de devoir faire appel à une deuxième commande printf en fait.
Ca ne m'étonnerait pas qu'il y ait encore moyen de l'alléger.
Enfin, je suis déjà bien content que ma frustration se soit partiellement atténuée!
0
m4ni4k > m4ni4k
29 mai 2009 à 03:00
ou pourquoi pas:
sudo sh -c '(printf "deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`%s main restricted universe multiverse\n" "" -security -updates;\
printf "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free\n")>/etc/apt/sources.list'

finalement!
0
m4ni4k > m4ni4k
1 juin 2009 à 23:32
Au détour de mes diverses recherches, je suis ENFIN tombé sur cette astuce qui permet à la commande printf de se comporter à la manière de la commande echo et donc de lui faire traiter plusieurs groupements de chaîne de caractères bien distincts, avec utilisation des abréviations {,} à partir d'une UNIQUE commande printf, et tout ceci sans le rajout systématique et agacant de cetespace propre à la commande echo.

On remarquera toutefois que cette solution, ainsi que celle à partir de la commande echo -e sont à utiliser avec précaution puisqu'elles nécessitent de faire appel à l'interpréteur bash.
Bon, trêve de bavardage, place au code:
sudo bash -c 'printf "%b\n" "$*""deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse"\
  "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free">/etc/apt/sources.list'

L'essentiel étant donc de substituer la commande echo -e par un printf "%b\n" "$*".
Voila, dorénavant, j'aimerais juste savoir si je devrai m'en tenir à cette dernière solution ou à la précédente (plus en conformité avec le shell standard) avec ses %s, ses (;) et ses 2 printf, ou s'il existe d'autres solutions plus commodes qui m'auraient complètement échappées!?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
28 mai 2009 à 15:00
Salut,

Et comme ça :
echo -e "deb file:/archive.ubuntu.com/ubuntu `lsb_release -sc`"{,-security,-updates}" main restricted universe multiverse\n\b" "deb file:/archive.ubuntu.com/medibuntu `lsb_release -sc` free non-free"
Ça ne te va pas ?
0
Eh bien non!!!
Je l'avais aussi retourné dans quasi tous les sens pour voir comment il agissait.
Je vous dis pas à quel point ça me frustre cette connerie!

C'est gentil d'essayer mais essayez quand même plus fort la prochaine fois ;-)
0