Comment puis-je faire sed des lignes de filtrage correspondant à une expression, mais ignorer les lignes non correspondantes, au lieu de les laisser s'imprimer?
À titre d'exemple réel, je veux exécuter scalac(le compilateur Scala) sur un ensemble de fichiers et lire à partir de sa -verbosesortie les .classfichiers créés. scalac -verboserenvoie un tas de messages, mais nous ne sommes intéressés que par ceux du formulaire [wrote some-class-name.class]. Ce que je fais actuellement est la suivante ( |&est la manière de bash 4.0 de diriger stderr vers le programme suivant):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Cela extraira les noms de fichiers des messages qui nous intéressent, mais laissera également passer tous les autres messages inchangés! Bien sûr, nous pourrions faire à la place ceci:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
qui fonctionne mais ressemble beaucoup à contourner le vrai problème, qui est de savoir comment demander sedà ignorer les lignes non correspondantes de l'entrée. Alors, comment faisons-nous cela?