118 votes

Faire en sorte que sed ignore les lignes non correspondantes

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

0voto

Obviously Points 11
sed -n '/.../!p'

Il n'est pas nécessaire de procéder à une substitution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X