Sublime - usuń wszystkie linie zawierające określoną wartość


116

Mam plik dziennika 900 MB, który mogę otworzyć w SublimeText 3. Ten plik jest rozdęty i zawiera wiersze podobne do poniższych.

10/08/2014 23:45:31:828,Information,,,,ExportManager: ,No records to send and/or not connected

Jak mogę odfiltrować wszystkie wiersze, które zawierają No records to send and/or not connected


Chociaż poniższe rozwiązania działają, ten typ pracy powinien być naprawdę wykonywany za pomocą sed / awk dla dużych plików.
Bar

Odpowiedzi:


229

Możesz wyszukiwać i zamieniać wyrażenia regularne:

Kliknij Znajdź> Zamień.

Upewnij się, że przycisk Wyrażenie regularne jest wciśnięty.

W polu Znajdź wpisz:

^.*No records to send and/or not connected.*\n

Pozostaw pole Zamień na puste.

Kliknij Zamień wszystko


16
Kropka / kropka na końcu jest ważna, bez niej nie zadziała. Alternatywnie możesz użyć tego:^.*No records to send and/or not connected\S.*$
Navigatron

To rozwiązanie jest jedyne możliwe, jeśli pracujesz na dużym pliku. Moja maszyna utknęła na kilka minut, gdy wybrałem Ctrl+Shift+K200 000 linii.
Przemek D

Spróbuję tego z moim plikiem 26 000 000 wierszy: ')
YB Przyczyna

64

Dla osób, które nie chcą pisać wyrażenia regularnego - możesz po prostu wybrać szukany ciąg, nacisnąć ctrl+cmd+glub wybrać z menu „Szybkie wyszukiwanie wszystkich”, co spowoduje wybranie każdego pasującego ciągu; stamtąd Homeprzesunie każdy kursor zaznaczenia na początek wiersza, shift+Endwybierze każdą pasującą linię i del, delusunie je wszystkie.

Edycja wielu kursorów jest fajna!


4
Jest to bardzo przydatna, bardziej uogólniona wskazówka. Moim celem było usunięcie wszystkich wierszy zawierających ciąg. Skończyło się na tym, że wybrałem jedną jego instancję, a następnie użyłem „QuickFind” ze skrótem, Ctrl+Cmd+Gjak sugeruje Leonid, aby wybrać wszystkie te ciągi. Po tym mogłem przejść bezpośrednio do „Usuń linię” Ctrl-Shift-Ki chirurgicznie wszystkie linie z tym ciągiem zostały usunięte w jednej chwili. Sublime Text to naprawdę najlepszy edytor tekstu, jakiego kiedykolwiek używałem.
MiB

Czy ctrl + cmd + g to to samo co ctrl + alt + g w systemie Windows? Nie mogłem zmusić tego do pracy
czarna panda

@black panda W systemie Windows „Szybkie wyszukiwanie wszystkiego” to alt + f3 - Dzięki Leonid +1
Christopher

Jeśli jesteś podobny do mnie i nie masz przycisku Home, możesz również użyć CMD + <- (strzałka w lewo)
Koray Tugay

4
Możesz także użyć cmd + L, aby rozszerzyć zaznaczenie do wiersza.
Koray Tugay

53

nie mogłem uruchomić wyrażenia regularnego, więc użyłem podejścia Alt-F3 z tej odpowiedzi:

/superuser/452189/how-can-i-filter-a-file-for-lines-containing-a-string-in-sublime-text-2/598999#598999

  1. Wybierz interesujący Cię ciąg
  2. Naciśnij Alt+, F3aby przejść do trybu wielu kursorów we wszystkich wystąpieniach ( Ctrl+ CMD+ Gw systemie Mac OS X)
  3. Naciśnij Ctrl+ L[zobacz komentarze] ( Cmd+ Lna Macu)
  4. Kopiuj i wklej zaznaczenie do innego bufora
  5. Del

2
Dwie rzeczy: (1) Możesz utworzyć link do indywidualnej odpowiedzi, takiej jak ta (2) Podsumuj tutaj drugą odpowiedź (i wyspecjalizuj ją, aby odpowiedzieć na to pytanie).
Widoczny kompilator

4
Możesz zamienić kroki 3 i 4 na CTRL + L, co rozszerza zaznaczenia na całe wiersze, łącznie z podziałem wiersza.
Chnossos

2
Dla takich jak ja przeklęty przez schemat klucza MAC: Ctrl+Cmd+Gaby w każdym przypadku używać wielu kursorów, Cmd+Lrozszerzać linie i zwykłe kopiowanie / wklejanie
Cyril Duchon-Doris

27

Oto, co znalazłem dla użytkowników systemu Windows:

  1. Wybierz ciąg (każda linia zawierająca ten ciąg ma zostać usunięta).
  2. Naciśnij klawisze ALT + F3.
  3. Naciśnij Ctrl + L.
  4. Naciśnij Usuń.

21

Żaden z sugerowanych powyżej kodów regex nie działał w moim przypadku, ale zadziałało:

.*(text in question).*

Pozwoli to na puste linie w kodzie, czy tego chcesz? Jeśli nie, dodaj \nlub $na końcu:.*(text in question).*\n
użytkownik

Jeśli linie mają strukturę podobną do „abc / xyz / coś”, aby użyć wyrażenia regularnego, dodaj „\”. Na przykład, jeśli musimy wyszukać cokolwiek pomiędzy abc / a / coś, wtedy wyrażenie będzie wyglądać następująco: abc /\.*.*\/ coś
Avik

U mnie działa, jeśli potrzebujesz wielu dopasowań, tak jak ja, użyj w ten |sposób:.*(a).*|.*(b).*|.*(c).*
bryc

0

Podczas edycji mapy witryny napotkałem podobny problem

To zadziałało dla mnie:

  1. Skopiuj ostatnie słowo w wierszach, które chcesz usunąć
  2. Znajdź wszystko
  3. Naciśnij klawisz Delete, aby usunąć całą linię

0

Powyższe odpowiedzi są poprawnymi sposobami, ale jeśli chcesz pozbyć się wierszy z nawet jednym ciągiem, zrób to, Znajdź -> Zastąp -> wstaw ^.*[a-zA-Z]+.*\nw sekcji wyszukiwania i zachowaj zastąpienie pustym. Naciśnij przycisk zamień wszystko, co spowoduje usunięcie wszystkich wierszy zawierających nawet jeden ciąg.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.