Forum Astuces.divers [Editeur] Changer

Posté par (page perso) .
Tags : aucun
0
29
mai
2001
$ perl -pi -e 's/windows/linux/g' mon_fichier
change toutes les occurences de "windows" en "linux" dans le fichier mon_fichier.

perl -pi.bak [...] sauvegarde l'ancien fichier avec l'extension ".bak".
  • # Perl non, sed oui!

    Posté par . Évalué à 1.

    Lancer perl juste pour faire de la substitution, alors que sed est fait pour ça...

    sed -e 's/windows/linux/g'

    Allez hop, un script!


    #!/bin/sh
    cat $1 | tee $1.bak | sed -e "s/$2/$3/g" > $1



    $ my_subst fic.txt windows linux


    PS: sed = 46K, perl = 700K...
    • [^] # Re: Perl non, sed oui!

      Posté par (page perso) . Évalué à 2.

      Sed ne respecte pas complètement les REGEX POSIX, ce qui dans certains cas est gênant.

      Mais ce qu'il y a de bien avec UNIX, c'est que TMTOWTDI :-)
    • [^] # ...sed pourquoi pas, mais pas n'importe comment

      Posté par . Évalué à 1.

      Allez hop, un script!
      ...

      Sauf que comme ça tu bousille ton fichier $1 qui est en même temps source et (surtout) destination.

      donc hop un autre script :

      !#/bin/sh
      mv $1 $1.bak && sed -e "s/$2/$3/g" > $1 < $1.bak


      PS: sed = 46K, perl = 700K...
      sauf que :
      - c'est plutôt : sh + sed (+ cat)? + (tee|mv) , soit 3 ou 4 fork+exec,
      - pour traiter plusieurs fichiers tu lances un seul perl...
    • [^] # Re: Perl non, sed oui!

      Posté par . Évalué à 1.

      Sur mon système, comme sur la plupart des systèmes actuels, sed se lance de manière quasi-instantanée, perl se lance de manière quasi-instantanée. Si le programme de substitution doit être exécuté un très grand nombre de fois, de manière automatique, sur un système vieux/chargé, etc, je comprends tes réticences... Mais pour faire des substitutions dans UN (ou quelques) fichier(s), pourquoi utiliser l'abominable sed alors que perl permet de faire bien plus, bien plus simplement?

      Dans ce contexte, l'option -i de perl, fonctionnalité que ne propose pas sed, est pratique(tm). Comme tout le reste de perl d'ailleurs. Sauf la gestion des références, qui est lourdingue(tm)
      • [^] # Re: Perl non, sed oui!

        Posté par (page perso) . Évalué à 1.

        GNU sed version 4.0.5

        options interessantes:
        -e script, --expression=script
        add the script to the commands to be executed
        -i[suffix], --in-place[=suffix]
        edit files in place (makes backup if extension supplied)
        -r, --regexp-extended
        use extended regular expressions in the script.
        -s, --separate
        consider files as separate rather than as a single continuous
        long stream.
        avec ca on doit pouvoir avoir les memes choses que perl (pas teste)
    • [^] # Re: Perl non, sed oui!

      Posté par . Évalué à 1.

      Autre avantage de perl: perl -pi.bak -e 's/bla/argh/' * marche sur un groupe de fichier. Ton script fonctionne uniquement sur un fichier.
      • [^] # Re: Perl non, sed oui!

        Posté par (page perso) . Évalué à 1.

        sed -i.bak -e 's/bla/argh/' *
        • [^] # Re: Perl non, sed oui!

          Posté par (page perso) . Évalué à 1.

          for in in *; do perl -pi -e 's/windows/linux/g' $i;done

          c'est plus propre et en plus dans un script sa te permet de rajouter des truc sympa dans la boucle (incrémenteur pour la progression, etc...)

          je suis ni franchement pour perl, ni pour sed, sauf que quand tu veut remplacer des espaces par \espace, j'ai toujours pas trouvé comment faire sa dans un script...
  • # Re: Changer

    Posté par (page perso) . Évalué à 1.

    sed -n 'H;$g;$s/tontruc/aremplacerpar/gp' tonfichier

    Sed n'est pas très bien documenté mais cela fonctionne mais utilise bcp de mémoire pour les grands fichiers...
    • [^] # Re: Changer

      Posté par . Évalué à 1.

      Et si je veux remplacer un caractère par un retour à la ligne je fais comment?

      J'ai sed 3.02 et les différents tests que j'ai effectué ne donnent rien :

      > sed s/;/\n/g
      > sed s/;/\
      /g

      pareil en doublant-triplant le backslash (le contreoblique pardon) ou en rajoutant des guillemets et cela sous bash, tcsh, zsh (bon j'ai du oublier quelques cominaisons)

      en fait la seule façon que j'ai trouvé c'est de passer par un sed -f toto
      avec toto contenant le \ suivi d'un retour à la ligne en dur

      Et en perl ça marche? (désolé j'en ai marre des tests)
      • [^] # Re: Changer

        Posté par (page perso) . Évalué à 1.

        sed "s/;/^M/g"
        • [^] # Re: Changer

          Posté par . Évalué à 1.

          Presque...
          Le prb c'est que ^M ça fait un retour au début de la même
          ligne, pas de la suivante... il suffit de mettre un ^J me direz vous?

          Ben sed n'est pas d'accord...:
          sed: -e expression #1, char 4: Unterminated `s' command
          • [^] # Re: Changer

            Posté par (page perso) . Évalué à 1.

            et si je veux changer des noms de fichier.

            par exemple transformer tous les é en e sur tous les fichiers contenus dans un répertoire

            on fait comment ?
            • [^] # Re: Changer

              Posté par . Évalué à 1.

              #!/bin/sh
              for i in *é* ; do
              i1=$(echo $i|sed -e y/é/e/)
              mv "$i" "$i1"
              done

              je pense que ca devrait marcher
            • [^] # Re: Changer

              Posté par . Évalué à 1.

              Tu utilises 'rename' qui est fait pour ça...

              rename 's/é/e/g' *

              (Et oui, c du perl...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.