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

Résolu/Fermé
Crisis66 Messages postés 6 Date d'inscription mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015 - Modifié par Crisis66 le 30/06/2015 à 10:05
Crisis66 Messages postés 6 Date d'inscription mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015 - 30 juin 2015 à 15:36
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 30/06/2015 à 10:21
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 mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015
30 juin 2015 à 10:24
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié par mamiemando le 30/06/2015 à 10:44
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024
30 juin 2015 à 14:20
Salut,

sed -i.bak '/members/{s/$/,member4/}' fichier
0
Crisis66 Messages postés 6 Date d'inscription mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015
30 juin 2015 à 10:39
ah en effet oui! merci beaucoup !
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 juin 2015 à 11:00
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 mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015
30 juin 2015 à 14:24
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 juin 2015 à 14:40
quel est le critère pour savoir quel member ?
0
Crisis66 Messages postés 6 Date d'inscription mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015
30 juin 2015 à 15:00
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 juin 2015 à 15:33
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 mardi 30 juin 2015 Statut Membre Dernière intervention 30 juin 2015
30 juin 2015 à 15:36
oui en effet
0