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?
Odpowiedzi:
Inny sposób z prostym sedem:
s///
jest podstawieniem,t
bez etykiety warunkowo pomija wszystkie kolejne polecenia,d
usuwa linię.Nie ma potrzeby używania perl ani grep.
(zredagowane za sugestią Nicholasa Rileya)
źródło
tx
id
użyć nowej linii zamiast średnika, jak otrzymywałemundefined label 'x;d;:x'
.sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'
(sugerowane w komentarzu do podobnego pytania ).sed -e 's/.../.../' -e 't' -e 'd'
.-e
opcji, więc nie wspominaj o niej ogólnie.Jeśli nie chcesz drukować niezgodnych wierszy, możesz użyć kombinacji
-n
opcja, która mówi sedowi, żeby nie drukowałp
flaga, która każe sedowi wypisać to, co zostało dopasowaneTo daje:
źródło
echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'
wyświetli obabar
iwoof
oddzielnych wierszach. Chociaż odmiana goto-label również nie obsługuje wielu wzorców, ponieważ usunie linię, jeśli pierwszy wzorzec nie pasuje.Użyj Perla:
źródło
Rapsey poruszył istotną kwestię dotyczącą wyrażeń wielokrotnych podstawień.
{}
(oddzielone średnikiem;
lub nową linią)Składnia:
Przykład (zobacz dokument tutaj, aby uzyskać więcej informacji):
Kod:
Wynik:
źródło
Nie ma potrzeby zmiany.
źródło