0008 Command_line

Ruby est aussi très à l’aise en mode 'script'. Il peut remplacer `sed`, `grep`, `awk`, ...

L’option -e permet de spécifier le script directement en argument.

Un des points communs aux différents utilitaires est le traitement ligne par ligne. Bien qu’il soit possible de faire une boucle dans le code, il sera souvent plus pratique d’utiliser l’option -n ou -p qui activera le traitement ligne par ligne.

0008-command_line_1.png

La documentation est d’ailleurs très explicite sur ces 2 options!

-n assume 'while gets(); ... end' loop around your script

-p assume loop like -n but print line also like sed

Le traitement ligne par ligne repose sur 2 variables globales spéciales et le comportement par défaut de print :

  • $/ est le séparateur utilisé pour identifier une ‘ligne’, par défaut vaut \n.
  • $_ contient la dernière ‘ligne’ lue avec gets. ⚠️ Le séparateur est inclut dans $_.
  • print sans argument affiche le contenu de la variable $_.

Ex 1 : Besoin d’ajouter un préfixe à chaque ligne?

0008-command_line_2.png

Ex 2 : Besoin de filtrer les lignes contenant un 2? (En utilisant slice!)

0008-command_line_3.png

Ex 3 : Besoin de faire un total? (comme awk Ruby a les blocs BEGIN et END!)

0008-command_line_4.png

Un dernier exemple où Ruby sera plus appréciable. Trier les mots de chaque ligne dans l’ordre alphabétique. On pourra même utiliser l’option -a (autosplit) pour récupérer chaque colonne dans une autre variable global spécial $F agissant ainsi encore plus comme awk!

0008-command_line_5.png

Les liens vers la documentation Ruby des arguments de ligne de commande, du man et de BEGIN / END (il y a d’ailleurs une erreur dans leur exemple, le voyez-vous?).