Jak mogę utworzyć linie dopasowania pasujące do pewnego wyrażenia, ale zignorować niepasujące linie, zamiast pozwolić im drukować?Czy chcesz, aby sed ignorował niepasujące linie?
Jako prawdziwy przykład, chcę uruchomić scalac
(kompilator Scala) na zbiorze plików i odczytać z jego pliku -verbose
utworzone pliki .class
. scalac -verbose
wyprowadza kilka wiadomości, ale interesują nas tylko te w postaci [wrote some-class-name.class]
. Co mam aktualnie robi się to (|&
to drogę do stderr rury Bash 4.0 do następnego programu):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
To będzie wyodrębnić nazwy pliku z wiadomościami, które są zainteresowani, ale będzie niech wszystkie inne wiadomości przejdą niezmienione! Oczywiście moglibyśmy zrobić zamiast tego:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
który działa, ale wygląda bardzo podobnie jak dzieje wokół rzeczywistego problemu, który jest jak instruować sed
ignorować niedopasowane wiersze z wejścia. Więc jak to robimy?
Na OS X 10.8.2 musiałem oddzielić 'tx' i' d' od znaku nowej linii zamiast średnika, gdy otrzymywałem 'niezdefiniowaną etykietę 'x; d;: x''. – davidchambers
Jeszcze lepiej: 'sed -e 's /.../.../' -e 'tx' -e 'd' -e ': x'' (sugerowane w komentarzu do [podobnego pytania] (http : //stackoverflow.com/a/1252191/312785)). – davidchambers
't' przeniesie się na koniec skryptu, jeśli nie zostanie dostarczona etykieta, więc prostsze: 'sed -e 's /.../.../' -e 't' -e 'd''. –