# La commande sed

**URL:** <https://www.debian-fr.org/t/la-commande-sed/75808>\
**Category:** Programmation\
**Created:** [Février 2, 2018, 7:28 UTC](https://www.debian-fr.org/t/la-commande-sed/75808 "2018-02-02T07:28:34Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![verhugues](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/74df32/32.png) [@verhugues](https://www.debian-fr.org/u/verhugues)\
**Post date:** [Février 2, 2018, 7:28 UTC](https://www.debian-fr.org/t/la-commande-sed/75808/1 "2018-02-02T07:28:34Z")

</div>

Bonjour,

J’étudie le partage de charge et la haute disponibilité à partir d’un article paru sur GLMF n° 97.  
A la fin de l’article, l’auteur présente un script pour automatiser le paramétrage des interfaces.  
Il y a une ligne «&nbsp;sed&nbsp;» que je n’arrive pas à saisir.  
Si quelqu’un pouvait me donner une indication.  
Voici la partie en question:

```
   > # Try to determine the VIP and the INTERFACE if they are not set:

```

> ```
> if ["$VIPS" = ""]; then
> HA_INIT=/etc/init.d/heartbeat
> if [-f $HA_INIT]; then
> HA_DIR=`grep "^HA_DIR=" $HA_INIT 2>/dev/null`
> HA_DIR=`echo $HA_DIR | cut -d';' -f1 | cut -d'=' -f2`
> LINES=(`sed -r -n "/IPaddr2::.*ldirectord/s/.*IPaddr2::([^[:space:]]*).*/\1/p" $HA_DIR/haresources | tr -s '\t ' `)
> 
> ```

> ```
> IND=0
> while [$IND -lt ${#LINES[@]} ]; do
> #echo ${LINES[$IND]}
> VIPS[$IND]=`echo ${LINES[$IND]} | cut -d/ -f1`
> INT=`echo ${LINES[$IND]} | cut -d/ -f3`
> if ["$INT" != ${VIPS[$IND]} ]; then
> INTERFS[$IND]=$INT
> fi
> IND=$[$IND + 1]
> done
> fi
> fi
> 
> ```

La ligne qui me pose problème est la suivante:

> sed -r -n «&nbsp;/IPaddr2::._ldirectord/s/.IPaddr2::([\[1\]])._/\1/p&nbsp;»  
> Je ne comprends pas le «&nbsp;/\1/&nbsp;»  
> Merci pour votre aide  
> Hugues

* * *

1. :space:

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 2, 2018, 8:03 UTC](https://www.debian-fr.org/t/la-commande-sed/75808/2 "2018-02-02T08:03:04Z")

</div>

Bon, sed est super loin, mais si j’ai bien compris:

/IPaddr2::.\*ldirectord/  
\<- matcher les lignes qui contiennent ce pattern

s/  
\<- y rechercher/remplacer

._IPaddr2::([^[:space:]]_).\*/  
\<-- ce qui matche la chaine qui contient “IPaddr2::” suivi d’une série de n’importe quel caractéres à la suite sauf des espaces blancs, et stocker cette chaine dans les variables de la regexp (la 1, puisque c’est la première rencontrée)

\1/  
\<- remplacer cette chaine matchée (c’est à dire la ligne entière) par le contenu de la variable 1 de la regexp

p  
\<- printer le résultat.

---

<div class="post-metadata">

**Author:** ![verhugues](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/74df32/32.png) [@verhugues](https://www.debian-fr.org/u/verhugues)\
**Post date:** [Février 2, 2018, 8:52 UTC](https://www.debian-fr.org/t/la-commande-sed/75808/3 "2018-02-02T08:52:24Z")

</div>

Merci pour cette réponse.  
Mais c’est pas clair quand même.  
Le fichier haresources contient:  
`N1 IPaddr2::10.122.138.3 ldirectord`  
Le résultat de la commande sed est:  
`10.122.138.3`  
Je n’arrive pas à faire lien avec ta réponse.  
Désolé  
Hugues

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 2, 2018, 9:07 UTC](https://www.debian-fr.org/t/la-commande-sed/75808/4 "2018-02-02T09:07:34Z")

</div>

> [@verhugues](#):
>
> Je n’arrive pas à faire lien avec ta réponse

Pourtant, c’est exactement le résultat qui était attendu:

- ce script sed ne s’intérèsse qu’au lignes contenant IPaddr2::.\*ldirectord
- quand il a une ligne qui matche, il analyse la ligne avec la regexp .\*IPaddr2::([\[1\]]\*).\* , et stocke dans la variable 1 de la regexp ce qu’il réussit à caser entre parenthèses (tout sauf des espaces blancs, donc)
- il renvoie ce qu’il a stocké dans cette variable 1

Je ne vois pas ce que tu ne comprends pas.

Si tu veux un résultat plus grossièrement expliqué avec les mots de ton sujet:  
il analyse ton fichier haressources pour y trouver les adresses ip sur lesquelles écoute ton ldirectord.

* * *

1. :space:

---

<div class="post-metadata">

**Author:** ![verhugues](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/74df32/32.png) [@verhugues](https://www.debian-fr.org/u/verhugues)\
**Post date:** [Février 2, 2018, 9:23 UTC](https://www.debian-fr.org/t/la-commande-sed/75808/5 "2018-02-02T09:23:07Z")

</div>

Ok, je viens de comprendre.  
C’est puissant comme outil  
merci

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 2, 2018, 9:33 UTC](https://www.debian-fr.org/t/la-commande-sed/75808/6 "2018-02-02T09:33:22Z")

</div>

> [@verhugues](#):
>
> C’est puissant comme outil

Bah c’est surtout la puissance des regexp.

Pour troller, je dirais que sed est justement merdique parcequ’il se base sur les commandes de ed pour faire l’edition du stream, et il n’y a pas plus abscons que la syntaxe ed.

Ca aurait du s’appeler semacs, pas sed… 😛
