Petit problème de grep

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 :

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 :

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 ?

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.

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

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])

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

Je pensais plutôt à l’enchaîner derrière ton premier grep :
[mono]grep -r --include="*.php" “<?” | grep -v “<?php”[/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.

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.

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+

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.

[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 :

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$