Ecrire à la fin d'une ligne ciblée sed

Résolu
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Après plusieurs recherches un peu partout sur le web, j'ai décidé de passer par le forum.
J'ai dans un fichier quelque chose qui ressemble à ça:

define hostgroup{
hostgroup_name hello ; The name of the hostgroup
# alias hello ; Long name of the group
members membre1,membre2,membre3
}

j'aimerai savoir comment sed peu m'aider à partir d'un script à écrire par exemple un "membre4" à la fin de la ligne members.
Si vous pouvez m'aider je vous en remercie d'avance
A voir également:

2 réponses

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Bonjour

Solution :

Tu peux utiliser ceci, en supposant que ton texte soit stocké dans
toto.txt
:

sed -i 's/\(.*members.*\)/\1,membre4/g' toto.txt


Exemple :

(mando@velvet) (~) $ cat toto.txt 
define hostgroup{
hostgroup_name hello ; The name of the hostgroup
# alias hello ; Long name of the group
members membre1,membre2,membre3
}

(mando@velvet) (~) $ sed -i 's/\(.*members.*\)/\1,membre4/g' toto.txt

(mando@velvet) (~) $ cat toto.txt
define hostgroup{
hostgroup_name hello ; The name of the hostgroup
# alias hello ; Long name of the group
members membre1,membre2,membre3,membre4
}


Explication :

sed attend un quadruplet de la forme 'operation/motif/remplacement/option' avec :
- operation :
s
(search and replace)
- option :
g
(global, ie appliqué à chaque morceau de ligne qui respecte le motif, on aurait pu ne rien mettre ici)

Détaillons à présent le motif et le replacement.

motif : Le but est de capturer toute la ligne contenant "members".
-
.*
signifie n'importe quelle séquence de caractère (espaces compris)
-
\(...\)
permet de mémoriser dans une variable (
\1
) ce qui a été capturé par le motif entre ces 2 parenthèses. Ici on capture tout le motif mais on pourrait dans l'absolu capturer plusieurs sous motifs (qui seraient stockés dans
\1
,
\2
, etc...)

remplacement : on utilise le contenu de la variable
\1
auquel on ajoute le morceau de texte à ajouter à la suite (ici
,membre4
).

Bonne chance
0
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Je vois ce que tu veux faire, en effet cela fonctionne. j'ai oublié par contre de préciser que j'ai plusieurs members dans mon fichier. N'est-il pas possible de localiser la ligne ou se trouve le members que je veux et de lui dire d'écrire à la fin de cette ligne en particulier?
Je te remercie de ton aide
0
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
De deux choses l'une :
- soit tu veux corriger toutes les lignes contenant members, dans ce cas tu peux utiliser la commande que je te donne.
- soit tu veux en modifier quelques une en particulier et il faut que le motif passé soit plus précis pour qu'il ne réagisse que sur les lignes que tu veux modifier.

Si tu ne peux pas discriminer ces lignes des autres, tu peux utiliser
vim
. C'est la même syntaxe que
sed
.

Concrètement :
1) Lance la commande
vim toto.txt
:
2) Appuie sur la touche Echap
3) Tape
:s/\(.*members.*\)/\1,membre4/gc
).

Tu noteras que l'on a passé l'option
c
qui demande confirmation (non supportée dans
sed
). Concrètement
vim
te demandera à chaque fois occurrence du motif trouvée si tu veux opérer le remplacement (y) ou pas (n).

Tu peux aussi écrire un petit script
awk
si tu veux quelque chose de plus poussé (par exemple, pour réagir sur une motif et un numéro de ligne donné). Mais je ne pense pas que
sed
offre une syntaxe qui permette de le faire.

Bonne chance
0
CépaMoi > mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention  
 
Salut,

sed -i.bak '/members/{s/$/,member4/}' fichier
0
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
ah en effet oui! merci beaucoup !
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
n'ajoute ,member4 qu'à la fin des lignes qui commencent par members
$ awk '/^members/ {$0=$0 ",member4"} {print}' fichier
define hostgroup{
hostgroup_name hello ; The name of the hostgroup
# alias hello ; Long name of the group
members membre1,membre2,membre3,member4
}
0
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
merci dubcek, mais comme j'avais dis en commentaires plus haut, en faite j'ai plusieurs members dans mon fichier. Mais j'ai résolu le problème, j'ai pu faire une substitution à ma ligne et ça a fait exactement ce que je voulais faire. merci encore :)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
quel est le critère pour savoir quel member ?
0
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
En faite j'ai fais selon le numéro de la ligne ou se trouve le member que je souhaite, je le recherche puis je le substitue
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
si il est à la ligne 4, on peut faire
awk '/^members/ && NR==4 {$0=$0 ",member4"} {print}' fichier
0
Crisis66 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
oui en effet
0