Comment puis-je faire sed
filtrer les lignes correspondantes en fonction d'une expression, mais ignorer les lignes non correspondantes, au lieu de les laisser s'imprimer ?
En guise d'exemple concret, je souhaite exécuter scalac
(le compilateur Scala) sur un ensemble de fichiers, et lit dans son fichier -verbose
sortir le .class
fichiers créés. scalac -verbose
produit un certain nombre de messages, mais nous ne nous intéressons qu'à ceux de la forme [wrote some-class-name.class]
. Voici ce que je fais actuellement ( |&
est la façon dont bash 4.0 envoie stderr au programme suivant) :
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Cela permettra d'extraire les noms de fichiers des messages qui nous intéressent, mais laissera passer tous les autres messages sans les modifier ! Bien sûr, nous pourrions faire ceci à la place :
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
qui fonctionne, mais qui ressemble beaucoup à un contournement du vrai problème, qui est de savoir comment instruire le sed
pour ignorer les lignes non correspondantes de l'entrée. Comment faire ?
2 votes
La réponse acceptée devrait être celle de mouviciel : stackoverflow.com/a/1665574/869951