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 -verbose
sortie les .class
fichiers créés. scalac -verbose
renvoie 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?