[MERCI] : Remplacement d'une chaine ds un fichier
Desole de repondre que maintenant mais j'étais rentrer dans mon Charollais (Bourgogne) pour manger de la bonne viande ! ;) Bref ! Je suis tres content de voir que bcp de monde a repondu, meme les traducteurs Avec toutes les reponses j'ai pu resoudre et surtout comprendre mon pbl ! Il suffit effectivement de desactiver les caracteres speciaux avec \ Merci de votre aide, je suis newbie sous linux (debian + gnome) et je suis content de voir qu'il existe une veritable communaute d'entraide pour pingouin !! Merci -- +--+ | David CABATON alias Obelix | +--+ | | |[EMAIL PROTECTED]| | | | Student in computer sciences | | | | GPG keys: 0x6BBB38E3 | | | +--+
Re: Remplacement d'une chaine ds un fichier
Le samedi 7 juin 2003, à 22:05, Loick.B écrivait : Je voudrais être capable de remplacer dans un fichier une chaine donnée. J'y parviens à l'aide de la commande: sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... Je reste convaincu que, comme d'habithude, il reste une méthode infaillible et très simple que je ne connais pas. Si tu utilises le sed du GNU, tu obtiendras l'effet désiré avec l'option -i : sed -i s/^admin$/toto/ /scripts/test/test.txt Tu as même la possibilité de conserver une copie de sauvegarde du fichier original. info sed pour les détails (le man est assez lapidaire). Et oui, sed passe par un fichier temporaire pour cela, mais tout ce qu'on lui demande, c'est de s'en occuper tout seul comme un grand et de nettoyer derrière, non ? Désolé si j'arrive un peu après la bataille... Laurent -- Une question ? La réponse est peut-être déjà dans la FAQ : http://savannah.nongnu.org/download/debfr-faq/html/index.html
Re: Remplacement d'une chaine ds un fichier
Si tu utilises le sed du GNU, tu obtiendras l'effet désiré avec l'option -i : sed -i s/^admin$/toto/ /scripts/test/test.txt Tu as même la possibilité de conserver une copie de sauvegarde du fichier original. info sed pour les détails (le man est assez lapidaire). Et oui, sed passe par un fichier temporaire pour cela, mais tout ce qu'on lui demande, c'est de s'en occuper tout seul comme un grand et de nettoyer derrière, non ? Désolé si j'arrive un peu après la bataille... Laurent Ben j'ai fais des tests, cette cmd me remplace bien tous les moi par toi dans le fichier mon pbl vient des caracteres speciaux comme et / Merci de votre aide :)) |sed s/moi/toi/g fich.moi fich.toi | -- +--+ | David CABATON alias Obelix | +--+ | | |[EMAIL PROTECTED]| | | | Student in computer sciences | | | | GPG keys: 0x6BBB38E3 | | | +--+
Re: Remplacement d'une chaine ds un fichier
dcabaton [EMAIL PROTECTED] writes: Bonjour, Si tu utilises le sed du GNU, tu obtiendras l'effet désiré avec l'option -i : sed -i s/^admin$/toto/ /scripts/test/test.txt Tu as même la possibilité de conserver une copie de sauvegarde du fichier original. info sed pour les détails (le man est assez lapidaire). Et oui, sed passe par un fichier temporaire pour cela, mais tout ce qu'on lui demande, c'est de s'en occuper tout seul comme un grand et de nettoyer derrière, non ? Désolé si j'arrive un peu après la bataille... Laurent Ben j'ai fais des tests, cette cmd me remplace bien tous les moi par toi dans le fichier mon pbl vient des caracteres speciaux comme et / Merci de votre aide :)) |sed s/moi/toi/g fich.moi fich.toi | Je ne suis pas sûr d'avoir bien compris ton problème, on essaie quand même ? sed s:moi:toi:g est équivalent à sed s/moi/toi/g donc, si tu as des / à mettre dans une des deux expressions, utilise la première formulation : sed s:moi/:toi:g par exemple pour les caractères , tu peux les échapper avec un \ sed s:\moi/\:toi:g par exemple En espérant avoir répondu à ta question. A+ PP -- Groupe Morbihannais d'Utilisateurs de Logiciels Libres http://www.tuxbihan.org Identifiant Jabber: [EMAIL PROTECTED] GPG fingerprint = 1A4F E154 3D2C A20E E4CA A543 7951 C5C2 E44A A0B5 Patrick Percot.
Re: Remplacement d'une chaine ds un fichier
On Sun, 8 Jun 2003 13:59:43 +0200 (CEST) waipro [EMAIL PROTECTED] wrote: Merci à tous de toutes ces idées et toutes ces précisions. Je pense que finalement, je vais utiliser la commande sed avec une suite de commande mv et rm. Toutes ces reflexions m'ont étées d'une aide précieuse et m'ont permis de mieux appréhender l'ensemble. Que les puristes de la liste m'excusent pour ce HS manifeste. Mais j'administre pas mal de serveurs en prod sour débian, et je constate que sur cette liste beaucoup ont de grosses compétences et n'hésitent pas en faire profiter les autres. Ce que, malheureusement, l'on ne retrouve que peu sur des listes plus spécialisées... Merci encore à tous. Loick. Salut, Je rappelle qu'il existe une liste de diffusion francophone sur les shellscript ici : http://www.debianworld.org/shellscript-fr.php @+ -- . ''`. E d i S T O J I C E V I C(\___/) : :' : http://www.debianworld.org (='.'=) `. `~' GPG: C360 FCF0 AB3A 2AB0 52E7 044F 1B3D 2109 1237 B032 ()_() `-
Re: Remplacement d'une chaine ds un fichier
Que les puristes de la liste m'excusent pour ce HS manifeste. Mais j'administre pas mal de serveurs en prod sour débian, et je constate que sur cette liste beaucoup ont de grosses compétences et n'hésitent pas en faire profiter les autres. Ce que, malheureusement, l'on ne retrouve que peu sur des listes plus spécialisées... Je rappelle qu'il existe une liste de diffusion francophone sur les shellscript ici : Est-ce moi, ou mes excuses étaient-elles mal formulées ou certains puristes(?) trop imbus d'eux mêmes pour les accepter? En tous les cas, encore une fois merci à tous les vrais administrateurs et développeurs compétant et disponibles (dans toutes la philosophie du libre comme je la conçois) qui ont pris la peine de me répondre sur la liste ou en privé... Au fait, merci Edi pour l'adresse! :-p Loick
Re: Remplacement d'une chaine ds un fichier
On Tue, Jun 10, 2003 at 12:44:48PM +0200, Loick.B (Debian List) wrote: Est-ce moi, ou mes excuses étaient-elles mal formulées ou certains puristes(?) trop imbus d'eux mêmes pour les accepter? Mais non, Edi ne fait que profiter de l'occasion pour faire la pub d'une autre liste. Si tu étais trop hors-sujet, tu n'aurais pas eu de réponse. Pour t'en convaincre, demande comment metter en place des jobs cron sous Windows XP et observe les réactions ;-) /Y -- Marbles should be kept together.
Re: Remplacement d'une chaine ds un fichier
Le Mardi 10 Juin 2003 12:44, Loick.B (Debian List) a écrit : Je rappelle qu'il existe une liste de diffusion francophone sur les shellscript ici : Est-ce moi, ou mes excuses étaient-elles mal formulées ou certains puristes(?) trop imbus d'eux mêmes pour les accepter? C'est une histoire de rangement... Si tu as besoin d'une recette de cuisine, tu vas plutôt chercher dans un bouquin de cuisine, non ? Tu auras toujours plus de chances avec un tel bouquin qu'en cherchant dans un magazine de pêche même si dans le magazine de pêche, tu trouveras peut-être d'excellents cuisiniers connaisant la recette de la carpe frite à l'espagnole. En plus celà permet de faire connaître cette liste (liée à Debian..) ! -- Michel Grentzinger OpenPGP key ID : B2BAFAFA Available on http://www.keyserver.net
Re: Remplacement d'une chaine ds un fichier
On Sat, Jun 07, 2003 at 10:05:07PM +0200, Loick.B wrote: Hello tous! Je galère actuellement dans l'écriture d'un script shell d'administration pour une chose toute bête! Je voudrais être capable de remplacer dans un fichier une chaine donnée. J'y parviens à l'aide de la commande: sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... Je reste convaincu que, comme d'habithude, il reste une méthode infaillible et très simple que je ne connais pas. vim ? Amicalement, Sven Luther
Re: Remplacement d'une chaine ds un fichier
Bonjour, Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... Je reste convaincu que, comme d'habithude, il reste une méthode infaillible et très simple que je ne connais pas. Je propose un sed -e s/avant/apres/ tonfichier tonfichier NON, sed lit ligne à ligne (ça permet de traiter n'importe quelle taille de fichier, je soupçone awk de faire pareil) Tu n'as d'autres choix que de faire un temporaire (avec sed) Fais un script qui te fabrique un nom temporaire (/tmp/$0.`date +%s` par exemple). Tu mets ton sed dedans et zou ! En plus, tu pourras le réutiliser plus tard (quand on met le doigt dans sed, on en sort plus ;-) Merci de votre aide et bon week-end, pas de quoi, pour le WE ça se fait :-) David Dumortier
Re: Remplacement d'une chaine ds un fichier
Le Samedi 7 Juin 2003 22:58, Felix SPORTELLI a écrit : Je propose un sed -e s/avant/apres/ tonfichier tonfichier Je viens d'essayer, le problème reste identique. A savoir; si je mets le même fichier en entré et en sortie, le fichier se retrouve vide (0o). En revanche si je fais: sed -e s/avant/apres/ tonfichier tonfichiers.new le fichier transformé est correct. Mais je reviens à mon point de départ: il me faut ensuite déplacer (ou supprimer) monfichier, et renommer monfichier.new en monfichier... Je trourne en rond. N'y aurrait-il pas d'autre solution en utilisant sed? Merci, Loick
Re: Remplacement d'une chaine ds un fichier
Le Dimanche 8 Juin 2003 07:56, Sven Luther a écrit : vim ? Milles excuse, mais ma culture sur l'utilisation de vim dans l'execution de scripts shell est bien trop limitée (pour ne pas dire inexistante) pour envisager de l'utiliser actuellement. :o) Merci. Loick
Re: Remplacement d'une chaine ds un fichier
Le Dimanche 8 Juin 2003 10:56, David Dumortier a écrit : NON, sed lit ligne à ligne (ça permet de traiter n'importe quelle taille de fichier, je soupçone awk de faire pareil) Voilà l'avis du spécialiste que je redoutais (l'avis, pas le spécialiste)! Je m'y attendais un peu à la conultation des faits... :-( Tu n'as d'autres choix que de faire un temporaire (avec sed) Fais un script qui te fabrique un nom temporaire (/tmp/$0.`date +%s` par exemple). Tu mets ton sed dedans et zou ! Et oui, c'est bien ce que je craignais. En plus, tu pourras le réutiliser plus tard (quand on met le doigt dans sed, on en sort plus ;-) Encore un truc à étudier! Merci encore. Loick
Re: Remplacement d'une chaine ds un fichier
Le dimanche 08 juin 2003, Loick.B a écrit... bonjour, sed -e s/avant/apres/ tonfichier tonfichiers.new sed -e s/avant/apres/ tonfichier tampon; tampon tonfichier; rm -f tampon C'est pas vraiment lourd comme syntaxe Sinon l'idée vim est très bonne. -- Jean-Michel N'oubliez pas la faq: http://savannah.nongnu.org/download/debfr-faq/html
Re: Remplacement d'une chaine ds un fichier
On Sun, Jun 08, 2003 at 11:37:43AM +0200, Loick.B wrote: Le Dimanche 8 Juin 2003 07:56, Sven Luther a écrit : vim ? Milles excuse, mais ma culture sur l'utilisation de vim dans l'execution de scripts shell est bien trop limitée (pour ne pas dire inexistante) pour envisager de l'utiliser actuellement. :o) $ vi fichier_a_modifie puis dans vim tu fait : ESC (pour obtenir le mode de commande, et le prompt : ci dessous) : 1,$s/^admin$/toto/ : wq Et voila. Cependant, je pense que cela copie quand meme le fichier d'une certaine facon, donc pas ce que tu souhaite faire, mais je ne pense pas que tu puisse modifier le fichier inline de toute facon, car admin et toto n'ont pas la meme taille. Tu pourrait a la limite remplacer tous les admin par des toto ou quelque chose du genre a l'aide d'un petit programme C ou quelque chose du genre. Moi je ferai un mmap du fichier, puuis parcourerait le fichier jusqu'a trouver le prochain ^admin$, et remplacerait par toto puis je continuerai. Amicalement, Sven Luther
Re: Remplacement d'une chaine ds un fichier
On Sun, Jun 08, 2003 at 11:53:49AM +0200, jean-michel OLTRA wrote: Le dimanche 08 juin 2003, Loick.B a écrit... bonjour, sed -e s/avant/apres/ tonfichier tonfichiers.new sed -e s/avant/apres/ tonfichier tampon; tampon tonfichier; rm -f tampon ^^^ cat Sinon l'idée vim est très bonne. vim fichier -c %s/avant/apres/g -c :wq En fait, il faudrait écrire une commande Unix qui: - lise stdin jusqu'à la fin - ensuite seulement, écrive tout sur stdout. On pourrait l'appeler sbuf (stream buffer), et ça permettrait de faire: cat fichier | sed s/avant/apres/ | sbuf fichier Peut-être qu'une telle command existe déjà, mais personne ne le connait? (Pas à mon avis, vu que la commande implique que la totalité du fichier va devoir être stocké en RAM, ce qui va à l'encontre des principes originaux d'Unix... Incidement, écrire dans un nouveau fichier puis le renommer est sans doute plus efficace que cette solution pour tout stream de taille importante). /Y -- Marbles should be kept together.
Re: Remplacement d'une chaine ds un fichier
Merci à tous de toutes ces idées et toutes ces précisions. Je pense que finalement, je vais utiliser la commande sed avec une suite de commande mv et rm. Toutes ces reflexions m'ont étées d'une aide précieuse et m'ont permis de mieux appréhender l'ensemble. Que les puristes de la liste m'excusent pour ce HS manifeste. Mais j'administre pas mal de serveurs en prod sour débian, et je constate que sur cette liste beaucoup ont de grosses compétences et n'hésitent pas en faire profiter les autres. Ce que, malheureusement, l'on ne retrouve que peu sur des listes plus spécialisées... Merci encore à tous. Loick.
Re: Remplacement d'une chaine ds un fichier
Merci à tous de toutes ces idées et toutes ces précisions. Je pense que finalement, je vais utiliser la commande sed avec une suite de commande mv et rm. Toutes ces reflexions m'ont étées d'une aide précieuse et m'ont permis de mieux appréhender l'ensemble. Que les puristes de la liste m'excusent pour ce HS manifeste. Mais j'administre pas mal de serveurs en prod sour débian, et je constate que sur cette liste beaucoup ont de grosses compétences et n'hésitent pas en faire profiter les autres. Ce que, malheureusement, l'on ne retrouve que peu sur des listes plus spécialisées... Merci encore à tous. Loick.
Re: Remplacement d'une chaine ds un fichier
On Sat, 7 Jun 2003 22:05:07 +0200 Loick.B [EMAIL PROTECTED] wrote: Je voudrais être capable de remplacer dans un fichier une chaine donnée. J'y parviens à l'aide de la commande: sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Ca doit être possible en perl. Si tu es un allergique aussi à perl, sarep permet de faire ça facilement: http://tarp.worldserve.net/software/sarep.html sarep admin toto test.txt Alain
Re: Remplacement d'une chaine ds un fichier
Le dim 08/06/2003 à 14:04, Loick.B (Debian List) a écrit : Merci à tous de toutes ces idées et toutes ces précisions. Je pense que finalement, je vais utiliser la commande sed avec une suite de commande mv et rm. Hop, hop, pas si vite ! Il y a aussi ed. Il fonctionne un peu comme sed, sauf qu'au lieu de rediriger le résultat sur la sortie standard, il modifie directement le fichier. $ cat toto aaa bbb ccc $ ed toto FIN 1,$ s/b/d/g w q FIN $ cat toto aaa ddd ccc Et voilà ! Léo.
Re: Remplacement d'une chaine ds un fichier
Yves Rutschle a écrit, dimanche 8 juin 2003, à 12:17 : [...] En fait, il faudrait écrire une commande Unix qui: - lise stdin jusqu'à la fin - ensuite seulement, écrive tout sur stdout. On pourrait l'appeler sbuf (stream buffer), et ça permettrait de faire: cat fichier | sed s/avant/apres/ | sbuf fichier Ici, c'est le shell qui ouvre fichier pour sbuf, plutôt : ... | sbuf fichier Peut-être qu'une telle command existe déjà, mais personne ne le connait? (Pas à mon avis, vu que la commande implique que la totalité du fichier va devoir être stocké en RAM, ce qui va à l'encontre des principes originaux d'Unix... Il existe une solution assez rusée, cf. Newsgroups: fr.comp.os.unix Subject: Re: sed Message-ID: [EMAIL PROTECTED] Date: 01 May 2003 10:04:52 GMT pour un remplacement de longueur inchangée. -- Jacques L'helgoualc'h FAQ DUF http://savannah.nongnu.org/download/debfr-faq/html/index.html ...tout ce que vous auriez dû lire avant d'oser le demander :)
Remplacement d'une chaine ds un fichier
Hello tous! Je galère actuellement dans l'écriture d'un script shell d'administration pour une chose toute bête! Je voudrais être capable de remplacer dans un fichier une chaine donnée. J'y parviens à l'aide de la commande: sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... Je reste convaincu que, comme d'habithude, il reste une méthode infaillible et très simple que je ne connais pas. Merci de votre aide et bon week-end, Erick.
Re: Remplacement d'une chaine ds un fichier
Le Sat, Jun 07, 2003 at 10:05:07PM +0200, Loick.B a écrit: Hello tous! lu Je galère actuellement dans l'écriture d'un script shell d'administration pour une chose toute bête! Je voudrais être capable de remplacer dans un fichier une chaine donnée. J'y parviens à l'aide de la commande: sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... Je reste convaincu que, comme d'habithude, il reste une méthode infaillible et très simple que je ne connais pas. Je propose un sed -e s/avant/apres/ tonfichier tonfichier Merci de votre aide et bon week-end, Erick. -- (o_ -+- Félix SPORTELLI -+- | Gpg key : 0xB629FE17 //\alias Neosadik | MAIL: [EMAIL PROTECTED] V_/_ Debian GNU/Linux user. | WWW : http://www.linux-village.org
Re: Remplacement d'une chaine ds un fichier
Loick.B a écrit, samedi 7 juin 2003, à 22:05 : Hello tous! bonsoir. [sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt] Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... perl -pi -e 's/^admin$/toto/' /scripts/test/test.txt ...mais il faudrait vérifier sur les inodes comment Perl s'y prend ; l'option « -pi.old » fait une sauvegarde. [...] Merci de votre aide et bon week-end, de rien et merci, -- Jacques L'helgoualc'h FAQ DUF http://savannah.nongnu.org/download/debfr-faq/html/index.html ...tout ce que vous auriez dû lire avant d'oser le demander :)
Re: Remplacement d'une chaine ds un fichier
Le Samedi 7 Juin 2003 22:58, Felix SPORTELLI a écrit : Je galère actuellement dans l'écriture d'un script shell d'administration pour une chose toute bête! Je voudrais être capable de remplacer dans un fichier une chaine donnée. J'y parviens à l'aide de la commande: sed s/^admin$/toto/ /scripts/test/test.txt /scripts/test/newtest.txt Mais il m'est impossible d'écrire dans le fichier lu (de le réecrire bref). Or je n'ai pas envie de supprimer, déplacer, et recopier... Je reste convaincu que, comme d'habithude, il reste une méthode infaillible et très simple que je ne connais pas. Je propose un sed -e s/avant/apres/ tonfichier tonfichier Non, ça écrase ton fichier et tu te retrouve avec un fichier vide ! -- Michel Grentzinger OpenPGP key ID : B2BAFAFA Available on http://www.keyserver.net
Re: Remplacement d'une chaine ds un fichier
Le samedi 07 juin 2003, Michel Grentzinger a écrit... bonjour, Je propose un sed -e s/avant/apres/ tonfichier tonfichier Non, ça écrase ton fichier et tu te retrouve avec un fichier vide ! Tu passes entre temps par un fichier tampon, que tu supprimes ensuite. -- Jean-Michel N'oubliez pas la faq: http://savannah.nongnu.org/download/debfr-faq/html
Re: Remplacement d'une chaine ds un fichier
On Sat, 7 Jun 2003 23:32:20 +0200 jean-michel OLTRA [EMAIL PROTECTED] wrote: Le samedi 07 juin 2003, Michel Grentzinger a écrit... bonjour, Je propose un sed -e s/avant/apres/ tonfichier tonfichier Non, ça écrase ton fichier et tu te retrouve avec un fichier vide ! Tu passes entre temps par un fichier tampon, que tu supprimes ensuite. En utilisant un pipe ca marche aussi : cat tonfichier | sed s/avant/après/g tonfichier Par contre je n'ai aucune idée du comportement que cela peut avoir avec de gros fichiers (et il est trop tard pour que je m'amuse à tester maintenant ;) ) a+ Julien