Journal 2 problèmes pour le prix d'un...

Posté par  .
Étiquettes : aucune
0
3
déc.
2003
cher journal...

(1) Je voudrais rechercher une chaînes de caractère dans les fichiers d'un répertoire et récupérer le nom des fichier contenant cette chaîne, pour pouvoir aller ensuite les voir de plus près.
Je voudrais aussi pouvoir faire la même chose, mais en rechercher remplacer...

Quelles commandes ou script utiliser ? (y a trop longtemps que je n'ais pas écris de script shell).

(2) moins important : j'ai un vieux pc qui me sert de serveur : pas de clavier pas de souris, pas d'écran. On viens de me donner un vieux palm m100 : est-ce que quelqu'un à déjà essayé de s'en servir comme terminal ? (une petite doc serait la bienvenue).

Voilà, merci !
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  . Évalué à 1.

  • # Re: 2 problèmes pour le prix d'un...

    Posté par  (site web personnel) . Évalué à 1.

    1 / kfilereplace : c'est en mode graphique mais ça dépanne et c'est très pratique

    2 / j'ai essayé avec un psion et ça marche niquel, donc avec un palm y a pas de raison (surtout avec un câble série)
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  (site web personnel) . Évalué à 1.

    je peux pas tester (et ca me semble simpliste au premier abord - je parle de ma solution), mais un 'cat * | grep machaine' ca ne donnerait rien pour le recherche de ladite chaine ?
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  (site web personnel) . Évalué à 4.

    1a:
    cd repertoire; grep -l "chaine" *

    1b:
    cd repertoire; perl -pi -e "s/chaine_a_chercher/remplacement/" *

    pour une recherche sur une arborescence, ça donne plutôt:
    find . -name "plop*" -print0 | xargs -0 grep -l "chaine"
    et
    find . -name "plop*" -print0 | xargs -0 perl -pi -e "s/chaine_a_chercher/remplacement/" *

    Je ne pense pas avoir dit trop de bêtises...


    2:
    joker.
    • [^] # Re: 2 problèmes pour le prix d'un...

      Posté par  (site web personnel) . Évalué à 1.

      Tu peux efficacement remplacer le find par l'option -r ( --recursive ) de grep

      Ca donnerait un truc du genre grep -lr "chaine" plop*

      L'option -i ( --ignore-case ) est interessante quand on ne sait pas si on cherche "Chaine", "CHAINE", "chaine" etc...

      Pour la substitution, j'utiliserai sed


      zut... j'viens d'voir que c'est ce qu'est proposé dans le commentaire en dessous...
      • [^] # Re: 2 problèmes pour le prix d'un...

        Posté par  (site web personnel) . Évalué à 1.

        Tu peux efficacement remplacer le find par l'option -r ( --recursive ) de grep

        Effectivement, c'est plus élégant dans les cas simples, donc la majorité du temps. Après find permet d'avoir des filtres de recherche beaucoup plus puissant que ceux de grep.

        Par contre, j'ai beau me déchirer les yeux sur 'man grep', je ne vois nulle part la mention de l'option -r , qui marche pourtant bien.

        Pour la substitution, j'utiliserai sed

        Je n'ai pas d'objection, mais entre perl et moi c'est le grand amour, je n'ai pas osé le tromper.
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  . Évalué à 1.

    (1) grep -l dans le repertoire en question, si c'est en recursif c'est grep -r -l ( ou rgrep -l ) ... pour plus d'infos, "man grep".

    pour le remplacement a la volée des chaines en questions, ya peut etre une autre solution mais je me ferais un truc du genre :

    for i in `grep -l machaine`; do
    cat $i | sed -e s/machaine/autrechaine/ > $i
    done

    Bon c'est rapide et j'ai pas testé mais ça devrait ressembler a un truc du genre, consultes les manuels pour vérifier et être sur que je te dis pas de conneries.

    (2) je sais pas j'ai pas de palm.
    • [^] # Re: 2 problèmes pour le prix d'un...

      Posté par  (site web personnel) . Évalué à 2.

      cat $i | sed -e s/machaine/autrechaine/ > $i

      Aie aie aie... on lit un fichier sur lequel on ecrit... et ce avec deux process. Y'a des chances que tout ca se termine par un fichier vide.

      vaut mieux remplacer la commande precedente par :
      sed -e s/machaine/autrechaine/ $i > $i.new ; mv $i.new $i
      • [^] # Re: 2 problèmes pour le prix d'un...

        Posté par  . Évalué à 1.

        Ouai je me suis dit ça aussi, mais j'ai pas trop les yeux en face des trous aujourd'hui :)
        Ta solution est en effet meilleur :)
      • [^] # Re: 2 problèmes pour le prix d'un...

        Posté par  (site web personnel) . Évalué à 1.

        ou mieux encore utiliser perl comme ecrit plus haut qui sait faire ca
        comme un grand.
        • [^] # Re: 2 problèmes pour le prix d'un...

          Posté par  . Évalué à 1.

          Apres c'est une question de preferences je pense, pour ce genre de traitement facile, perso, je n'utiliserais pas perl ...
      • [^] # Re: 2 problèmes pour le prix d'un...

        Posté par  . Évalué à 1.

        encore mieux :
        sed -i -e s/machaine/autrechaine/ "$i"

        extrait de man sed :

        -i[suffix], --in-place[=suffix]
        edit files in place (makes backup if extension supplied)


        (ne pas oublier les guillemets autout du nom de fichier, ça peut jouer des tours avec des noms de fichiers contenant des espaces par exemple)
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  (site web personnel) . Évalué à 1.

    Pour (1) :
    Ça dépend de ce que tu veux chercher.

    Cas trivial, utilise grep:
    grep -ri 'chaine' /mon/repertoire/

    Cas où tu veux filtrer aussi sur des motifs de fichiers (ne considère que les fichier .txt par ex):
    find / -name '*.txt" -type f -exec grep -iH 'chaine' \{\} \;
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  (site web personnel) . Évalué à 1.

    ma version:
    find . -exec grep toto \{\} \; -print
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  . Évalué à 1.

    pour 1a, l'outil de KDE déjà cité est très bien , mais je pense que tu veux qqchose comme :

    for i in *; do
    grep -q "le truc que je cherche" $i;
    if [ $? == 0 ] ; then
    echo $i;
    fi;
    done

    Si tu veux un recherche qui soit insensible à la casse : remplace grep par gerp -i.

    Pour le cecher/remplacer, faut fair un truc avec sed ou awk, mais je mastérise pas trop ces moteur d'ER...

    Mais un truc du genre
    for i in *; do
    cat $i | sed -e "s/totofrom/tototo/g" > $i.new;
    done
    fait presque ce que tu veux, ya plus qu'a remplacer tous les fichers.new en fichiers. Il me semble que cela est necessaire, car on ne peut pas piper un fichier vers lui-même en fin de course (qqun pour confirmer ?).

    David
    • [^] # Re: 2 problèmes pour le prix d'un...

      Posté par  . Évalué à 2.

      Je me réponds à moi-même pour dire que :
      -il faut lire grep -i et non gerp -i
      -j'avais oublié le grep -l qui fait exactement ce qu'on veut. Faut toujours aller voir nos amies les man.

      David
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  . Évalué à 1.

    Aï pas taper : honte à moi j'ai pas regarder le man de grep, quand je l'utilise c'est presque toujours : comande param | grep machaine...

    Bon du coté de sed, jamais utilisé, quoique un très vague souvenir (ma dernière expérience d'écriture de script c'était en cours de systèmes il y a 3-4 ans...). Man me voilà...
  • # Re: 2 problèmes pour le prix d'un...

    Posté par  . Évalué à 2.

    Pour le (1), c'était le sujet d'une colonne dans arstechnica il y a une semaine ou deux.

    http://arstechnica.com/etc/linux/2003/linux.ars-11112003-2.html(...)

    Au menu: rechercher remplacer dans un répertoire, mettre en gras les occurrences d'une chaine recherchée, et quelques astuces vraiment symmpa en bash...

Suivre le flux des commentaires

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