2009-08-13 6 views
2

J'utilise généralement perl one liners au lieu de grep pour rechercher dans les fichiers.Comment imprimer les noms des fichiers en cours de traitement dans un Perl One-Liner?

Par exemple suivant affiche tous les emplacements contenant #include <stdio.h>

perl -ne "print if(/#include\s*[\"<]stdio.h/)" */*.[ch] 

Mais je ne pouvais pas trouver un moyen d'imprimer le nom du fichier qui a obtenu ces lignes. J'ai essayé d'imprimer $ARGV[0] mais sans succès. Alors, comment imprimez-vous les noms de fichiers qui contiennent ces lignes?

+1

Utiliser grep. Et puis votre problème disparaîtra (grep -l) –

+0

@depesz Il disparaît seulement jusqu'à ce que vous deviez faire quelque chose de plus complexe. –

+1

Rétractation de ma réponse: $ _ était interprété par le shell, pas par perl, malgré des guillemets, etc. Essayez echo $ _: La var contient la deuxième partie de la dernière commande, c'est pourquoi ma réponse semblait imprimer les noms de fichiers Champs obligatoires. –

Répondre

4

$ARGV est la variable spéciale pour le nom du fichier en cours de lecture. Je crois que c'est ce dont vous avez besoin.

4

utilisant ack, qui est un remplacement gentil (écrit en perl) pour grep:

$ ack --cc '#include' 

NB

Je sais, je triche :-P

+3

En effet, ack est un grand remplacement grep. – Pinochle

+0

Ne pas tricher, mais sed est l'outil approprié pour remplacer grep. –

+2

@William: Hein? 'sed' édits,' grep' correspond. Comment 'sed' est-il l'outil approprié pour remplacer' grep'? – Telemachus

10

La variable qui contient le nom du fichier auquel *ARGV est ouvert est $ARGV, et non $ARGV[0] (qui est le premier élément de @ARGV).

print "$ARGV: $_" if /include\s*[\"<]stdio.h/; 
Questions connexes