Come è possibile creare linee di corrispondenza del filtro sed
in base ad alcune espressioni, ma ignorare le righe non corrispondenti, invece di lasciarle stampare?Sono ignorare le righe non corrispondenti
Come esempio reale, voglio eseguire scalac
(il compilatore Scala) su un set di file e leggere dal suo output -verbose
i file .class
creati. scalac -verbose
emette un sacco di messaggi, ma siamo interessati solo a quelli del modulo [wrote some-class-name.class]
. Quello che sto facendo attualmente è presente (|&
è il modo bash 4.0 di stderr pipe al programma successivo):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Questo estrarrà i nomi dei file dai messaggi che ci interessa, ma sarà anche lasciare che tutti gli altri messaggi passino invariati! Naturalmente potremmo fare invece questo:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
che funziona ma è molto simile in giro per il problema reale, che è il modo di istruire sed
di ignorare le linee non corrispondenti dall'ingresso. Quindi come lo facciamo?
Su OS X 10.8.2 ho dovuto separare 'tx' e' d' con una nuova riga piuttosto che un punto e virgola mentre ricevevo l'etichetta non definita 'x; d;: x''. – davidchambers
Ancora meglio: 'sed -e 's /.../.../' -e 'tx' -e 'd' -e ': x'' (suggerito in un commento su una [domanda simile] (http : //stackoverflow.com/a/1252191/312785)). – davidchambers
't' trasferirà alla fine dello script se non viene fornita un'etichetta, in modo più semplice: 'sed -e 's /.../.../' -e 't' -e 'd''. –