Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/07/2007, 21h53   #1
Invité de passage
 
Inscription : juillet 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 4
Points : 1
Points : 1
Par défaut Modification de fichiers, sed

Bonjour,

Soit le fichier essai.php :
Citation:
blabla
</div>
Au revoir
Je souhaite obtenir dans resultat/essai.php :
Citation:
blabla
Toto
</div>
Au revoir
Si je fais :
Citation:
sed "s~</div> Au revoir~Toto </div> Au revoir~g" essai.php > resultat/essai.php
Cela ne fonctionne pas.
Je pense que le problème vient du saut de ligne, mais je n'arrive pas à trouver la solution.

Le but est de faire une modification de fichiers .php en masse.

Merci d'avance.
a1b2c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2007, 22h48   #2
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Citation:
Envoyé par a1b2c

Le but est de faire une modification de fichiers .php en masse.

Merci d'avance.

Remplace tout enregistrement commençant ( ^ ) par blabla suivi de n'importe quel(s) caractère(s) jusqu'à la fin de l'enreg. ( cf expressions régulières ) par blabla ( & ) suivi de NewLine et Toto

Code :
1
2
 
sed -i "s/^blabla.*$/&\nToto/" test.txt
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 21h42   #3
Invité de passage
 
Inscription : juillet 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 4
Points : 1
Points : 1
Cela ne fonctionne pas.

Je précise les données du problème : blabla désigne du code html qui varie d'un fichier à l'autre ; seule la fin du code est commune à tous les fichiers.

Reformulation de la question : comment insérer une ligne de code - par exemple <?include("toto.php");?> - à la ligne précédent le premier </div> d'un fichier (et seulement le premier) ?
a1b2c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2007, 23h22   #4
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
Code foo.sed :
1
2
3
4
5
6
7
\~</div>~ {
  i\
<?include("toto.php"); ?>
  :a
  n
  ba
}

Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
$ cat file
foo
bar
</div>
foo
</div>
$ sed -f foo.sed < file
foo
bar
<?include("toto.php"); ?>
</div>
foo
</div>
C'est bien ça ?
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2007, 21h31   #5
Invité de passage
 
Inscription : juillet 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 4
Points : 1
Points : 1
Tout à fait, ça a fonctionné.
Merci beaucoup, cela m'a évité un travail long et fastidieux.
Pourriez-vous me préciser la signification de
ou me donner un lien vers une ressource en la matière ?
a1b2c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2007, 23h16   #6
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
:a sert à définir un label (que je nomme "a").
n sert à passer à la ligne suivante (en affichant la ligne courante)
ba sert à faire un saut (un goto) vers le label a.

Bref, le but est de traiter tout le reste du fichier sans faire de traitement dessus. Cela évite d'insérer la ligne avant chaque </div>.

Pour la ressource, le mieux est de lire man sed et info sed.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 20h48   #7
Invité de passage
 
Inscription : juillet 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 4
Points : 1
Points : 1
Merci.
a1b2c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 19h40   #8
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Alternative:
Code :
sed '0,/^<\/div>/ s/^.*$/<?include("toto.php"); ?>\n&/' fichier
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h19   #9
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
... ce qui ne marche pas (testé avec 2 Sed différents, dont celui de Gnu). Tu as essayé sur l'exemple que j'ai donné ?

Ton code ajoute le include devant toutes les lignes, jusqu'à ce qu'on trouve le </div>. Il ne veut l'insérer qu'une seule fois.

Remarque en passant : pour les adresses, la première ligne est 1. Certains Sed refusent l'adresse 0.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h41   #10
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Effectivement, manque le masque de </div> dans la substitution.
Code :
< sed '0,/^<\/div>/ s/^<\/div>.*$/<?include("toto.php"); ?>\n&/' fichier
Ta solution sera sans doute plus rapide car elle s'arrêtera après le premier traitement du <div>.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h33.


 
 
 
 
Partenaires

Hébergement Web