La commande sed

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 “sed” 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 "/IPaddr2::.ldirectord/s/.IPaddr2::([^[:space:]])./\1/p"
Je ne comprends pas le "/\1/"
Merci pour votre aide
Hugues

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.

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

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::([^[:space:]]*).* , 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.

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

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… :stuck_out_tongue: