OVH Cloud OVH Cloud

remplacer une lgne dans un fichier

6 réponses
Avatar
pere.noel
quel est le "meilleur" outil unix pour remplacer une ligne dans des
fichiers sous un répertoire donné ??

le but :

je télécharge des exemples en ruby qui ont :
#!/usr/bin/ruby

et je voudrais donc remplacer cette ligne (contenant "#!.*bin/ruby")
par la ligne :
#!/opt/local/bin/ruby

--
une bévue

6 réponses

Avatar
pere.noel
Une bévue wrote:

quel est le "meilleur" outil unix pour remplacer une ligne dans des
fichiers sous un répertoire donné ??


bon j'ai fait ça en ruby...
--
une bévue

Avatar
nospam
Une bévue wrote:

quel est le "meilleur" outil unix pour remplacer une ligne dans des
fichiers sous un répertoire donné ??


Pour ce genre de choses, sed est tout indiqué.

Suggestion de présentation :

$ sed 's+usr/bin/ruby+opt/local/bin/ruby' fichier > fichier.tmp

puis, après vérification éventuelle du résultat :

$ mv fichier.tmp fichier

(attention, sed remplacera la première occurrence de la chaîne dans
toutes les lignes où elle apparaît).

Pour une série de fichiers, par exemple fic1, fic2, ..., ficN :

$ for i in fic*
do
sed '.....' $i > $i.tmp
mv $i.tmp $i
done

A++
--
Christian

Avatar
pere.noel
Christian Fauchier wrote:

$ sed 's+usr/bin/ruby+opt/local/bin/ruby' fichier > fichier.tmp

puis, après vérification éventuelle du résultat :

$ mv fichier.tmp fichier

(attention, sed remplacera la première occurrence de la chaîne dans
toutes les lignes où elle apparaît).

Pour une série de fichiers, par exemple fic1, fic2, ..., ficN :

$ for i in fic*
do
sed '.....' $i > $i.tmp
mv $i.tmp $i
done


merci pour l'info, j'ai réalisé mon script en ruby mais j'essayerai
sed...
en command line c'est plus marrant ))

avec ruby je supprime toutes les lignes qui contiennent
/^#!.*bin/ruby$/
(à mon avis il n'y en a jamais qu'une seule)

donc, avec sed on n'est pas obligé d'escaper "/" ?
--
une bévue

Avatar
nospam
Une bévue wrote:

donc, avec sed on n'est pas obligé d'escaper "/" ?


Non. Il faudrait le faire si on conservait le séparateur de chaînes par
défaut de sed qui est '/', mais on peut le remplacer par n'importe quel
autre caractère ('+' dans mon exemple) et du coup, '/' devient un
caractère comme un autre (c'est aussi vrai dans vi). Par contre, les
métacaractères comme . ou * doivent eux toujours être escapés.

A++
--
Christian

Avatar
Eric Jacoboni
(Une bévue) writes:

avec ruby je supprime toutes les lignes qui contiennent
/^#!.*bin/ruby$/
(à mon avis il n'y en a jamais qu'une seule)

donc, avec sed on n'est pas obligé d'escaper "/" ?


En Ruby non plus :)

Il suffit d'utiliser %r pour définir une regexp délimitée par autre
chose que /, histoire d'éviter les collisions avec le / littéral...

Si je prend l'exemple de ta regexp, ça donnerait :

%r+^#!.*bin/ruby$+

(j'ai choisi + comme délimiteur ici... )
--
Eric Jacoboni, ne il y a 1439250429 secondes

Avatar
pere.noel
Eric Jacoboni wrote:

%r+^#!.*bin/ruby$+


ok, merci, c'est bon à savoir...
--
une bévue