IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Remplacement d'une chaine dans un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut Remplacement d'une chaine dans un fichier
    Bonjour,

    je souhaite remplacer dans un ensemble de fichiers une chaine de caractère (un chemin d'accès) par une autre chaine (un autre chemin). Je suis arrivé à cette solution à base de find/sed/redirection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj -exec sh -c 'sed "s|my/old/path|my/new/path|" < {} > {}' \;
    Le résultat me donne des fichiers vides (l'output est créé avant l'input visiblement)
    Si je change la redirection > {} par > {}.new par exemple, alors j'ai bien mes modifications souhaitées dans les fichiers .new, mais je souhaite avoir ces modifications dans les fichiers originaux.

    Ou est-ce que je rate un truc ?
    En vous remerciant

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    est-ce que le sed sur ton système dispose de l'option --in-place ? sinon, utilise mv pour écraser les originaux avec {}.new
    ...
    ?

    j'aurais mis ma main au feu que sh n'aurais pas su ce qu'est {}, et jaurais perdu
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Si l'option "--in-place" existe, alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj -exec sed -i.bak "s|my/old/path|my/new/path|" {} \;
    Le '.bak" c'est au cas ou

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Si l'option "--in-place" existe, alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj -exec sed -i.bak "s|my/old/path|my/new/path|" {} \;
    Le '.bak" c'est au cas ou

    Cette solution fonctionne très bien, donc je suppose que l'option --in-place est disponible sur mon système (OS X).

    Merci beaucoup

  5. #5
    Membre très actif

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Par défaut
    Bonjour,

    Plutôt que l'option -exec de find qui crée un nouveau process pour chaque fichier, tu peux utiliser xargs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj | xargs sed -i.bak "s|my/old/path|my/new/path|"
    Si les fichiers ont des espaces, cela génèrera des erreurs. Il faudra passer des options supplémentaires pour arriver au résultat correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj -print0 | xargs -0 sed -i.bak "s|my/old/path|my/new/path|"

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Citation Envoyé par dtrosset
    Plutôt que l'option -exec de find qui crée un nouveau process pour chaque fichier, tu peux utiliser xargs.
    sous-entendu, xargs ne crée pas de nouveaux process pour les commandes qu'il fait se répéter pour chaque argument.

    Comment peut-on mettre cette affirmation en évidence, stp ?

    edit : ah ? man find /-exec
    -exec commande {} +
    […]The command line is built in much the same way that xargs builds its command lines.
    ergo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj -exec sed -si.bak "s|my/old/path|my/new/path|" {} +
    devrait être encore plus efficace, non ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    edit : ah ? man find /-exec
    ergo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -name *.pbxproj -exec sed -si.bak "s|my/old/path|my/new/path|" {} +
    devrait être encore plus efficace, non ?
    Yes, mais ATTENTION toutefois avec OS X


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Chercher et remplacer une chaine dans un fichier texte C
    Par étoile de mer dans le forum Débuter
    Réponses: 6
    Dernier message: 14/11/2011, 11h59
  2. insérer une chaine dans un fichier XML
    Par 242 dans le forum Linux
    Réponses: 2
    Dernier message: 14/12/2006, 16h32
  3. detruire une chaine dans un fichier texte
    Par rober dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 08/11/2006, 09h27
  4. ecrire une chaine dans un fichier [prob]
    Par rogerio dans le forum C++
    Réponses: 5
    Dernier message: 31/05/2006, 02h20
  5. Réponses: 15
    Dernier message: 26/03/2006, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo