Derniers journaux de JMVF :
- [20/11@15:17] Recherche de doc...
- [07/10@10:31] enregistrement téléphonique...
- [01/10@08:59] proxy et configuration réseau...
- [02/09@10:49] Latex encore...
- [22/08@11:02] LaTeX et glossaire...
- [21/08@10:01] recherche d'une référence...
Journal : 2 problèmes pour le prix d'un...
Posté par JMVF () le 03 décembre 2003(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 !
> Lire le journal (22 commentaires, moyenne: 1,3).
Re: 2 problèmes pour le prix d'un...
Pour le 2 : http://linuxfr.org/tips/171.html(...)
Re: 2 problèmes pour le prix d'un...
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...
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 lom (page perso, ) le 03/12/2003 à 11:20. (lien). Évalué à 1.Le problème est que tu trouves bien la chaîne, mais que tu n'as pas le nom du fichier.
Et a priori c'est ce qui est demandé.
-
[^]Re: 2 problèmes pour le prix d'un...
-
[^]Re: 2 problèmes pour le prix d'un...
Posté par Florent MANENS (page perso, ) le 03/12/2003 à 13:08. (lien). Évalué à 1.Utilisation excessive de cat ?
man grep :
-H, --with-filename
Print the filename for each match.
grep -H machaine *
Re: 2 problèmes pour le prix d'un...
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 B r u n o (page perso, ) le 03/12/2003 à 14:46. (lien). É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 lom (page perso, ) le 03/12/2003 à 15:50. (lien). É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...
-
-
Re: 2 problèmes pour le prix d'un...
(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 Bonnefille Guilhem (page perso, ) le 03/12/2003 à 11:33. (lien). É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...
-
[^]Re: 2 problèmes pour le prix d'un...
Posté par -=[ Benoit Plessis ]=- (page perso, ) le 03/12/2003 à 12:25. (lien). Évalué à 1.ou mieux encore utiliser perl comme ecrit plus haut qui sait faire ca
comme un grand.--
Il [e2fsck] a bien démarré, mais il m'a rendu la main aussitot en me disant "houlala, c'est pas beau à voir votre truc, je préfèrerai que vous teniez vous même la tronçonneuse" (traduction libre)-
[^]Re: 2 problèmes pour le prix d'un...
-
-
[^]Re: 2 problèmes pour le prix d'un...
Posté par Khanh-Dang (page perso, ) le 03/12/2003 à 17:59. (lien). É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...
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...
ma version:
find . -exec grep toto \{\} \; -print
Re: 2 problèmes pour le prix d'un...
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 David Douard () le 03/12/2003 à 11:34. (lien). É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...
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...
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...

Les journaux sont destinés à des informations qui ne sont pas suffisamment intéressantes
pour être validées en dépêche (sinon n'hésitez pas à proposer votre information en
dépêche), qui sont sans rapport avec Linux ou le libre, ou simplement pour donner votre
avis. Si vous désirez poser une question, merci d'utiliser 
Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.