Comment faire pour sed
filtrer des lignes correspondant à une expression, mais ignorer les lignes qui ne correspondent pas, au lieu de les laisser imprimer?Avoir sed ignorer les lignes non-correspondantes
Comme un exemple concret, je veux courir scalac
(le compilateur Scala) sur un ensemble de fichiers, et lire à partir de sa sortie -verbose
les fichiers créés .class
. scalac -verbose
sort un tas de messages, mais nous sommes seulement intéressés par ceux du formulaire [wrote some-class-name.class]
. Ce que je suis en train de faire est ce (|&
est le moyen de tuyau stderr bash 4.0 sur le prochain programme):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Cela va extraire les noms de fichiers des messages qui nous intéressent, mais laissez également tous les autres messages passer inchangé! 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 à faire le tour du problème réel, ce qui est de savoir comment instruire sed
d'ignorer les lignes qui ne correspondent pas à partir de l'entrée. Alors, comment faisons-nous cela?
Sous OS X 10.8.2, je devais séparer 'tx' et' d' avec une nouvelle ligne plutôt qu'avec un point-virgule car j'obtenais 'label non défini 'x; d;: x''. – davidchambers
Encore mieux: 'sed -e 's /.../.../' -e 'tx' -e 'd' -e ': x'' (suggéré dans un commentaire sur une [question similaire] (http : //stackoverflow.com/a/1252191/312785)). – davidchambers
't' sera transféré à la fin du script si aucune étiquette n'est fournie, donc plus simple: 'sed -e 's /.../.../' -e 't' -e 'd''. –