Jak mogę ustawić sed
filtrowanie pasujących wierszy według jakiegoś wyrażenia, ale ignorować niedopasowane wiersze, zamiast pozwolić im drukować?
Jako prawdziwy przykład chcę uruchomić scalac
(kompilator Scala) na zestawie plików i odczytać z jego -verbose
danych wyjściowych .class
utworzone pliki. scalac -verbose
wyświetla kilka komunikatów, ale interesują nas tylko te z formularza [wrote some-class-name.class]
. To, co obecnie robię, to ( |&
jest to sposób basha 4.0 na przesłanie stderr do następnego programu):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Spowoduje to wyodrębnienie nazw plików z wiadomości, które nas interesują, ale także przepuści wszystkie inne wiadomości bez zmian! Oczywiście moglibyśmy zamiast tego zrobić:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
co działa, ale wygląda bardzo podobnie do obejścia prawdziwego problemu, czyli instrukcji sed
ignorowania niepasujących wierszy z danych wejściowych. Jak więc to robimy?