Jak mogę ustawić sedfiltrowanie 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 -verbosedanych wyjściowych .classutworzone pliki. scalac -verbosewyś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 sedignorowania niepasujących wierszy z danych wejściowych. Jak więc to robimy?