# Petit problème de grep

**URL:** <https://www.debian-fr.org/t/petit-probleme-de-grep/63496>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496 "2016-02-21T20:47:03Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![christov](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/e56c9b/32.png) [@christov](https://www.debian-fr.org/u/christov)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/1 "2016-02-21T20:47:03Z")

</div>

Bonjour

Je cherche dans mes fichiers php ceux que j’ai écrit en commençant par \<? et non \<?php (pour les corriger)

Si je fais une recherche du genre :

```auto

```

J’obtiens bien les fichiers commençant par \<? ou \<?php

Donc je cherche les fichiers qui contiennent \<? suivi d’un retour chariot  
J’ai essayé :

`grep -r --include="*.php" "<?\n"
grep -r --include="*.php" "<?\r"`  
Mais aucun ne marche, pas de résultats (alors qu’il devrait y en avoir)

Ce que je ne comprends pas c’est que si je fais :

```auto

```

Je trouve plein de fichiers contenant des retour chariots

J’ai l’impression qu’il y a un problème à cause de \< et ?

Une idée ?

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/2 "2016-02-21T20:47:03Z")

</div>

Tu peux utiliser l’option [mono]-v[/mono] de grep pour obtenir les fichiers ne contenant pas une chaîne de caractères donnée, ce serait peut-être plus simple à utiliser dans ton cas.

---

<div class="post-metadata">

**Author:** ![christov](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/e56c9b/32.png) [@christov](https://www.debian-fr.org/u/christov)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/3 "2016-02-21T20:47:04Z")

</div>

C’est une bonne idée, je viens d’essayer mais ça me renvoi toutes !! les lignes qui ne contiennent pas “\<?php”, ça fait trop

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/4 "2016-02-21T20:47:04Z")

</div>

Pour visualiser (avant et après la modif par [mono]sed[/mono]) la première ligne de tous les fichiers [mono].php[/mono] qui seront trouvés par [mono]find[/mono]:  
[mono]find . -type f -name “\*.php” -exec head -n1 {} ;[/mono]

====  
(Dans ce qui est affiché sur [mono]fond gris[/mono] et dans la ligne suivante,  
[mono]\n[/mono] représente un retour à la ligne)

Pour remplacer les [mono]\<?\n[/mono] par [mono]\<?php\n[/mono]  
et remplacer les [mono]\<? [/mono] par [mono]\<?php [/mono] (des fois qu’il y ait des premières lignes comme [mono]\<? texte sur la même première ligne[/mono])

```auto

```

====  
En espérant que ça corresponde à ce que tu voulais faire,  
bien que ce ne soit pas fait en utilisant [mono]grep[/mono].

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/5 "2016-02-21T20:47:04Z")

</div>

> [@christov](#):
>
> C’est une bonne idée, je viens d’essayer mais ça me renvoi toutes !! les lignes qui ne contiennent pas «&nbsp;\<?php&nbsp;», ça fait trop

Je pensais plutôt à l’enchaîner derrière ton premier grep :  
[mono]grep -r --include=«&nbsp;\*.php&nbsp;» «&nbsp;\<?&nbsp;» | grep -v «&nbsp;\<?php&nbsp;»[/mono]

Il me semble tout de même que la solution proposée par MicP est bien plus pratique, quoiqu’un peu occulte pour quelqu’un qui comme moi n’utilise jamais find.

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/6 "2016-02-21T20:47:05Z")

</div>

En décomposant la ligne de commande : [mono]find . -type f -name “\*.php”[/mono] [mono]-exec[/mono] [mono]sed -i -e ‘s/\<?$/\<?php/’ -e ‘s/\<? /\<?php /’[/mono] [mono]{}[/mono] [mono] ;[/mono]

[mono]find[/mono] rechercher

[mono].[/mono] dans le répertoire courant et ses sous-répertoires

[mono]-type f[/mono] les fichiers de type “fichier régulier”

[mono]-name "_.php"[/mono] dont le nom se termine par (ou extension) [mono].php[/mono] (noms de fichiers correspondants au motif [mono]_.php[/mono])

[mono]-exec[/mono] exécuter la commande qui suit

[mono]sed -i -e ‘s/\<?$/\<?php/’ -e ‘s/\<? /\<?php /’[/mono] (voir la syntaxe de la commande [mono]sed[/mono])

[mono]{}[/mono] La chaîne [mono]{}[/mono] sera remplacée par le nom du fichier en cours de traitement.

le [mono] ;[/mono] terminera la commande [mono]-exec[/mono]

====  
Pour tester, remplace la commande [mono]sed[/mono] par [mono]ls[/mono], ce qui donne une ligne de commande comme la ligne suivante :

[mono]find . -type f -name “\*.php”[/mono] [mono]-exec[/mono] [mono]ls {}[/mono] [mono] ;[/mono]

qui va appliquer la commande [mono]ls[/mono] sur chaque fichier trouvé par [mono]find[/mono]

====  
NOTE: En fait, il y a mieux comme ligne de commande, car dans le [mono]man find[/mono],  
on peut lire qu’il vaudrait mieux utiliser [mono]-execdir[/mono] car cela permet :  
de ne lancer la commande ([mono]sed[/mono]) qu’une seule fois, par, et depuis le répertoire du ou des fichiers à traiter (si cette commande peut traiter plusieurs fichiers à la fois, ce qui est le cas pour [mono]sed[/mono]),  
et d’utiliser un chemin relatif pour les noms de fichiers.

---

<div class="post-metadata">

**Author:** ![christov](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/e56c9b/32.png) [@christov](https://www.debian-fr.org/u/christov)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/7 "2016-02-21T20:47:05Z")

</div>

Super parfait !

Le grep me convient très bien !

Le find, je vais le décortiquer avant de l’utiliser mais ça va me servir !

Merci

a+

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/8 "2016-02-21T20:47:06Z")

</div>

Merci MicP, en fait la syntaxe de find est très claire, c’est surtout celle de sed qu’il va me falloir bosser.  
Je l’ai déjà utilisé dans quelques scripts shell, et avec le man ouvert à côté ce n’est pas si compliqué finalement.

---

<div class="post-metadata">

**Author:** ![thuban](https://www.debian-fr.org/user_avatar/www.debian-fr.org/thuban/32/4177_2.png) [@thuban](https://www.debian-fr.org/u/thuban)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/9 "2016-02-21T20:47:06Z")

</div>

[quote=“MicP”]En décomposant la ligne de commande : [mono]find . -type f -name “\*.php”[/mono] [mono]-exec[/mono] [mono]sed -i -e ‘s/\<?$/\<?php/’ -e ‘s/\<? /\<?php /’[/mono] [mono]{}[/mono] [mono] ;[/mono]

[mono]{}[/mono] La chaîne [mono]{}[/mono] sera remplacée par le nom du fichier en cours de traitement.  
[/quote]  
Les [mono]{}[/mono] sont à mettre entre guillements en cas de fichier à espaces (que c’est mal) par exemple, donc comme ça :

```auto

```

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 21, 2016, 8:47 UTC](https://www.debian-fr.org/t/petit-probleme-de-grep/63496/10 "2016-02-21T20:47:11Z")

</div>

> [@thuban](#):
>
> …Les {} sont à mettre entre guillements en cas de fichier à espaces…

Je croyais aussi,  
mais même sans les guillemets, les noms de fichier avec espace n’ont pas l’air de le déranger.

`michel@debG53SW:~/.cache/vlc/art/artistalbum$ echo "test" > "nom de fichier avec espace.jpg"
michel@debG53SW:~/.cache/vlc/art/artistalbum$ find . -type f -name "*.jpg" -exec ls {} \;
./Zappa _ Mothers/Roxy & Elsewhere/art.jpg
./Loco Locass/Amour Oral/art.jpg
./Christian Queinnec/Programmation réticulaire/art.jpg
./Lou Reed/Transformer/art.jpg
./Frank Zappa/Sheik Yerbouti/art.jpg
./Zappa/Joes Garage Acts I, II, & III/art.jpg
./Led Zeppelin/Led Zeppelin III/art.jpg
./Led Zeppelin/Led Zeppelin/art.jpg
./Al DiMeola/Friday Night In San Francisco/art.jpg
./Stupeflip/Stup Religion/art.jpg
./Stupeflip/Stupeflip/art.jpg
./Jethro Tull/Aqualung/art.jpg
./nom de fichier avec espace.jpg
./Paco de Lucia - Al Di Meola - John McLaughlin/The Guitar Trio/art.jpg
michel@debG53SW:~/.cache/vlc/art/artistalbum$ 
michel@debG53SW:~/.cache/vlc/art/artistalbum$ find . -type f -name *espace.jpg -exec ls {} \;
./nom de fichier avec espace.jpg
michel@debG53SW:~/.cache/vlc/art/artistalbum$ find . -type f -name *espace.jpg -exec rm {} \;
michel@debG53SW:~/.cache/vlc/art/artistalbum$ find . -type f -name *espace.jpg -exec ls {} \;
michel@debG53SW:~/.cache/vlc/art/artistalbum$ 
`
