3 votes

Récupérer les lignes "TODO" d'un fichier texte

Je suis en train de modifier un projet dans GEdit (éditeur de texte). Quand je tape TODO, il le surligne en jaune pour référence future. J'ai pas mal de ces TODO ici et là.

Pour rendre plus clair ce que j'ai besoin de faire, est-ce que quelqu'un pourrait me montrer une façon d'extraire toutes les lignes TODO d'un tas de fichiers et de les mettre dans un fichier texte appelé, par exemple, TODOs.txt ?

Je possède quelque chose comme ça :

// TODO: Gestion des erreurs.

Et je voudrais que cela soit mis dans un fichier comme celui-ci :

* Gestion des erreurs

Une application Linux (CLI, GUI peu importe) serait préférable, mais un script regex ou une autre méthode qu'une personne pourrait imaginer serait bien.

2voto

Riley Lark Points 11212

Essayer grep TODO -rnf * > TODOs.txt

2voto

chutsu Points 2399

Si le fichier est git version controlée, vous pouvez vouloir réutiliser le grep de git. Pour rechercher des TODOs dans vos fichiers sources, tapez la commande suivante à la racine du dépôt

git grep TODO

La commande affiche quelque chose comme ceci:

[~/projects/atl][ros] > git grep TODO
atl_gazebo/src/plugins/quadrotor_gplugin.cpp:  // TODO: changer pour le contrôleur d'attitude en mode déporté

Pour inclure le numéro de ligne, ajoutez le drapeau -n:

[~/projects/atl][ros] > git grep -n TODO
atl_gazebo/src/plugins/quadrotor_gplugin.cpp:92:  // TODO: changer pour le contrôleur d'attitude en mode déporté

Pour plus d'options, consultez la documentation ici.

1voto

DVK Points 63282

Si votre liste de fichiers contenant des TODO est stockée dans un fichier, disons nommé "file_list.txt", exécutez :

grep -n `cat file_list.txt` > TODOs.txt

Cela récupérera une liste de toutes les lignes contenant la chaîne "TODO", précédée du nom du fichier et du numéro de ligne, et stockera cela dans TODOs.txt

1voto

pragmatic Points 11

Les réponses de Riley Lark (et d'EdoDodo) sont probablement les plus concises, cependant pour ne pas faire apparaître le texte "TODO" littéralement dans la sortie, vous pourriez utiliser ack:

ack --no-group 'TODO (.*)' --output=' $1' > TODOs.txt

Sortie:

lib/Example.pm:102: Déplacer _cmd dans un rôle distinct
lib/Example.pm:364: Ajouter un paramètre de nom de fichier
lib/Example2.pm:45: Déplacer le bloc de commentaires au format POD

Si vous voulez un format légèrement différent, ajouter l'option --no-group donnerait:

lib/Example.pm
102: Déplacer _cmd dans un rôle distinct
364: Ajouter un paramètre de nom de fichier

lib/Example2.pm
45: Déplacer le bloc de commentaires au format POD

0voto

thkala Points 36148

Cela trouvera de manière récursive toutes les lignes contenant '// TODO' dans n'importe quel fichier sous le répertoire courant :

grep -rn '// *TODO' .

Cela nettoie un peu la sortie :

grep -rn '// *TODO' . | while read l; do
        echo "$(cut -d : -f 1,2 <<<"$l"):$(sed 's|.*//[[:space:]]*TODO||' <<<"$l")"
done

Notez que cela pourrait poser problème s'il y a des deux-points (:) dans les noms de fichiers de votre code source.

Vous pouvez mettre la sortie dans un fichier avec une redirection finale.

ÉDIT :

Ceci est encore mieux :

grep -rn '// *TODO' . | sed 's|^\([^:]*:[^:]*:\).*//[[:space:]]*TODO|\1|'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X