Opérations sur chaines dans un fichier

medo -  
jipicy Messages postés 41342 Statut Modérateur -
Bonjour,
J'ai un fichier 1 où j'ai par exemple: mot1 mot2 mot3
Je souhaite faire un traitement sur un fichier 2 où je souhaite:
- remplacer mot1 par mot1' dans la chaine: "salut... mot1 ... toto"
- supprimer les lignes qui contiennent: "bonjour... mot2... au revoir" et "bonjour... mot2... coucou"
les chaines entourant mot2 et mot3 peuvent etre differentes.
Avez-vous une idée de comment le faire? j'ai essayé d'utiliser awk ou sed mais j'ai pas su comment !
Merci pour votre aide
A voir également:

7 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

Merci de mettre le fichier "AVANT" traitement puis "APRES" traitement , histoire qu'on s'entende bien ;-))
0
medo
 
Merci pour ta réponse
c'est vrai, c'est pas tres clair

fichier AVANT:
salut... mot1 ... toto
bonjour... mot2... au revoir
bonjour... mot3... coucou"

fichier APRES:

salut... UnAutreMot ... toto

mot1, mot2 et mot3 doivent etre lus d'un autre fichier
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
mot1, mot2 et mot3 doivent etre lus d'un autre fichier
Ils sont lus comment ? Séquentiellement ?
Il n'y a que ces mots dans le fichier ?
mot1 est toujours à changer et les 2 autres à effacer ?
0
medo
 
mot1, mot2 et mot3 sont lus je suppose séquentiellement via awk par exemple, mais si tu as une autre solution, je suis preneur. C'est un 2eme fichier où il y a mo1 mot2 mot3 mot4 .. etc sur une seule ligne ou sur des lignes différentes (je peux choisir)
le 1er mot dans le fichier est toujours à remplacer
la présence d'un mot parmi tous les autres impliquent la suppression de la ligne qui le contient
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Désolé je ne vois pas comment faire, y'a un truc qui m'échappe ;-((

Peut être comme ça :
[trash]$ cat plop
salut... mot1 ... toto
bonjour... mot2... au revoir
bonjour... mot3... coucou"

[trash]$ cat toto
mot1
mot2
mot3

[trash]$ var="$(sed -n '1p' toto)"

[trash]$ sed -i.bak '/'"$var"'/!d; s//UnAutreMot/' plop

[trash]$ cat plop
salut... UnAutreMot ... toto

[trash]$
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
medo
 
merci
ça répond à la moitié du probleme puisque j'ai oublié de préciser que le fichier plop contient d'autres lignes qui doivent rester inchangées.
du coup si j'arrive à utiliser une variable dans la commande sed, le probleme sera résolu, du genre:
for (i=1;i<4;i++)
{
var="$(sed -n 'ip' toto)";
sed -i.bak '/'"$var"'/d;
}
donc, comment remaplcer 1p par ip ?
0
medo
 
Merci jipicy
c'est bon, il fallit jsute remplacer 1p par '$i'p dans une boucle for
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
$ cat plop
salut... mot1 ... toto
blablabla
bonjour... mot2... au revoir
blabla
bonjour... mot3... coucou"

$ cat toto
mot1
mot2
mot3

$  while read line;do sed -i "/$line/d" plop;done < <(sed -n '1!p' toto) &&
> var="$(sed -n '1p' toto)"; sed -i "s/${var}/UnAutreMot/" plop

$ cat plop
salut... UnAutreMot ... toto
blablabla
blabla
blabla

$
;-))
0