Script remplacer ligne + champ

Résolu/Fermé
chris - 7 juil. 2010 à 09:54
 chris - 8 juil. 2010 à 17:59
Bonjour,
je cherche a ecrire un script qui me permet :
de remplacer une ligne par une autre selon un mot clé, et aussi de modifier un des cjamps, par exemple:
cat plop
ligne1
1 2 3 4 5 6 7
ligne3 toto
ligne4 tata
ligne5 titi

je voudrais modifier la ligne qui contient le mot clé "titi", en remplaçant toute la ligne de cette manière:
"ligne5 titi" devient "ligne6 tutu"

je voudrais également remplacer le 5eme champ de la ligne 2, de cette manière:
"1 2 3 4 5 6 7" devient "1 2 3 4 8 6 7"

Merci pour vos réponses à venir !


A voir également:

18 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 juil. 2010 à 10:01
Salut,

Tu n'as rien trouvé par toi même ? Ne serait-ce qu'une bribe ?

C'est un peu le même principe ;-\
0
oui j'ai bien la solution pour insérer du texte après un mot clé, mais pas pour remplacer la ligne contenant le mot clé...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 juil. 2010 à 10:22
0
alors j'ai réussi la 1ere partie consistant à remplacer une ligne par une autre (par l'intermediaire de 2 commandes sed, une qui insere ma ligne avant la ligne a supprimer, une qui supprime la ligne en question)
par contre concernant la 2eme partie...je coince !
voila mon besoin :
je voudrais également remplacer le 5eme champ de la ligne 2, de cette manière:
"1 2 3 4 5 6 7" devient "1 2 3 4 8 6 7"
0

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

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 juil. 2010 à 12:31
par l'intermediaire de 2 commandes sed,
Avec une seule commande ça suffit amplement :

[tmpfs]$ cat plop
ligne1
1 2 3 4 5 6 7
ligne3 toto
ligne4 tata
ligne5 titi
[tmpfs]$ sed -i.BAK '/titi/c\
ligne6 tutu
' plop
[tmpfs]$ cat plop
ligne1
1 2 3 4 5 6 7
ligne3 toto
ligne4 tata
ligne6 tutu
[tmpfs]$

;-))
0
ok ca c'est la solution simplifiée pour résoudre mon 1er probleme (deja resolu)
mais concernant le 2nd ?
j'ai une piste pour isoler mon champ a modifier, mais je n'arrive pas a le modifier...
head -2 plop | tail -1 | awk '{print $5}'
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 juil. 2010 à 13:12
[tmpfs]$ cat plop
ligne1
1 2 3 4 5 6 7
ligne3 toto
ligne4 tata
ligne6 tutu
[tmpfs]$ sed -i.ORIG '2 s/. /8 /5' plop
[tmpfs]$ cat plop
ligne1
1 2 3 4 8 6 7
ligne3 toto
ligne4 tata
ligne6 tutu
[tmpfs]$
0
alors ca marche dans ce cas précis, mon souci, c'est que j'ai plusieurs fichiers a traiter...et que je veux modifier le 5eme champ de la ligne 2 (et non pas le chiffre 5), d'ou mon choix de awk !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 juil. 2010 à 14:14
Ben mon exemple modifie le 5ème champ (enfin la 5ème occurrence comprenant un caractère suivi d'un espace pour être précis) et non pas le chiffre 8 !

[tmpfs]$ cat plop
ligne1
1 2 3 4 8 6 7
ligne3 toto
ligne4 tata
ligne6 tutu
[tmpfs]$ sed  '2 s/. /3 /5' plop
ligne1
1 2 3 4 3 6 7
ligne3 toto
ligne4 tata
ligne6 tutu
[tmpfs]$
0
ha oui en effet mon problème vient de la, c'est que mes fichiers ne sont pas forcement formatés de la meme facon....
cat plop
ligne1
1 2 3 4 5 6 7

cat plop1
ligne1
1 2 3 4 5 6 7

cat plop2
ligne1
1 2 3 4 5 6 7
0
je ne sais pas pourquoi ca ne se voit pas, mais il y a plus d'espaces entre les chiffres dans plop1 et plop2 !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 juil. 2010 à 15:11
Faut coller ton texte entre les balises "<code>TON TEXTE ICI</code>"
0
je disais donc :
ha oui en effet mon problème vient de la, c'est que mes fichiers ne sont pas forcement formatés de la meme facon....
cat plop
ligne1
1 2 3 4 5 6 7

cat plop1
ligne1
1   2 3  4 5   6 7

cat plop2
ligne1
1 2  3 4   5   6 7
0
je reviens sur le sujet, vous voyez le probleme pour plop2 par exemple ?
si j'effectue :
sed '2 s/. /3 /7' plop2
j'obtiens:
ligne1
1 2  3 4   5 3 6 7

ceci a cause de l'interpretation des espaces
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
8 juil. 2010 à 12:12
Il te faut voir du côté de "awk" pour traiter les champs... "sed" n'étant plus/pas du tout adapté pour ce genre de traitement.
0
c bien ce que je pensais, g un debut avec
head -2 plop | tail -1 | awk '{print $5}'
mais je ne vois pas comment remplacer ce 5eme champ...(qui peut voir + d'un caractere !)
sinon je ne vois pas non plus, du coté de sed, comment remplacer tous les champs commencant pas "2009" ?
du style :
sed '2 s/2009*/20100708/' plop
mais le "*" remplace simplement ce qu'il y a apres 2009
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
8 juil. 2010 à 12:31
Pour "awk", désolé je ne peux pas t'aider ;-(

Par contre pour "sed" que veux-tu faire exactement ?

Merci de poster un exemple AVANT => APRES
0
merci c'est ok j'ai utilisé sed et je modifie toute la fin de ligne (qui sera identique pour tous mes fichiers):
sed -i '2 s/2009.*/20100708 )/' plop
0