Skip to content

[Bash] Modifier une occurence dans une série de fichiers

9 août 2011

Si vous faîtes de la mise en donnée massive ou que vous avez parfois besoin de modifier la même occurrence dans beaucoup de fichiers en simultané. Voici un petit script qui peut vous aider.

Le problème est simple rechercher tous les fichiers dans une sous-arborescence de répertoires avec find afin d’y modifier une occurrence avec sed.

#! /bin/bash

# On vérifie que le bon nombre d'arguments a été envoyé au script.
if [ $# -ne 3 ] ;
then
  echo " Usage : " $0 " 'FILES' 'STRING TO REPLACE' 'REPLACEMENT STRING' "
  exit
fi

# On charge les arguments
FILE=$1
TEXTE=$2
REPLACE=$3

# Oncherche l'ensemble des fichiers concernés.
FILES=`find -name "$FILE"`

# On applique les modifications
for i in $FILES; do
  sed "s/$TEXTE/$REPLACE/g" "$i" > tmp
  mv tmp $i
done

Pour se servir du script :
script.sh ‘*.txt’ ‘Salut mon amour’ ‘Adieu traîtresse’

Qui permettra de modifier toutes vos lettres d’amour en une commande.🙂
Bon le script doit être améliorable en modifiant directement le fichier sans passer par tmp et le find peut être améliorer à souhait.

9 commentaires leave one →
  1. Applewhite permalink
    9 août 2011 20 h 53 mi

    Encore plus simple:
    Avec une combinaison de find , xargs et sed on fait le même chose en une commande et facilement. Je vous laisse chercher comment pour un autre billet😉

  2. alexis permalink
    9 août 2011 20 h 55 mi

    Pas besoin d’un script, tu peux tout faire en une seule commande. Pour reprendre ton exemple, tu peux faire ça :

    find . -name « *.txt » -exec sed -i ‘s/Salut mon amour/Adieu traîtresse/g’ {} +

  3. 10 août 2011 6 h 48 mi

    L’avantage du script est de pouvoir le mettre dans un répertoire du $PATH et sur une machine partagée tout le monde a accès à ces commandes.

  4. kim permalink
    10 août 2011 17 h 40 mi

    mouaif, avantage maigre : le find peut être placé en « commande alias » globale à tous les utilisateurs🙂

  5. François permalink
    10 août 2011 21 h 00 mi

    Ou Bufdo dans vim, pas de bash, ni d’alias ni de find à la syntaxe impossible…🙂

    http://pwet.fr/blog/chercher_remplacer_dans_tous_les_buffers_de_vim

  6. 10 août 2011 22 h 21 mi

    La version « propre » : http://paste.pocoo.org/show/456240/
    Autant se servir de la puissance des commandes UNIX au lieu de faire une boucle « for » qui plantera au moindre espace dans les noms de fichier.

    #! /bin/bash

    # On vérifie que le bon nombre d’arguments a été envoyé au script.
    if [ $# -ne 3 ]
    then
    echo « Usage: $0 ‘FILES’ ‘STRING TO REPLACE’ ‘REPLACEMENT STRING' » >&2
    exit 1
    fi

    # On charge les arguments
    FILE= »$1″
    TEXT= »$2″
    REPLACE= »$3″

    # On cherche l’ensemble des fichiers concernés.
    find -name « $FILE » -exec sed -i « s/$TEXT/$REPLACE/g » « {} » \;

  7. LIAR permalink
    11 août 2011 15 h 48 mi

    Encore plus simple : perl -pei🙂

  8. nesthib permalink
    12 août 2011 8 h 54 mi

    @kim : les alias ne gèrent pas les arguments mais avec une fonction bash c’est super simple

    function srch () { echo find . -name « $1 » -exec sed -i « s/$2/$3/g » {} +; }

    à mettre dans le .bashrc

    @boutor : même si tu veux garder un script, le tien est mal construit
    – la récriture des arguments est inutile
    – le stockage des fichiers trouvés dans une variable peut amener des problèmes (la taille du contenu d’une variable est limitée et il peut y avoir un soucis avec les noms de fichiers exotiques)
    – la tournure find -exec évite l’utilisation d’une boucle et permet de travailler en même temps que s’effectue la recherche (et non d’attendre la fin)
    – l’utilisation d’un fichier temporaire sans aucune précaution alors que sed peut modifier un fichier en place

  9. nesthib permalink
    12 août 2011 8 h 56 mi

    (NB. dans mon commentaire précédent le echo est à virer, c’était juste pour le test)

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :