Usuń wszystkie linie w Notepad ++ z wyjątkiem linii zawierających słowo, którego potrzebuję?

181

Mam plik tekstowy i chcę, aby linie zaczynały się od <Path>i usuń wszystkie pozostałe linie.

Jak mogę to zrobić?

wonea
źródło
Związane z: stackoverflow.com/questions/8264391/…
Cees Timmerman
Wtyczka LineFilter2 jest również łatwa w użyciu.
Karsten

Odpowiedzi:

265

Jest to łatwy sposób na osiągnięcie tego. Musisz wykonać 3 kroki.

  1. Przejdź do menu Szukaj & gt; Znajdź ... & gt; Wybierz kartę „Zaznacz”. Aktywuj wyrażenia regularne. Szukać ^<Path> ( ^ jest dla początku linii). Nie zapomnij zaznaczyć „Linie zakładek” i naciśnij „Zaznacz wszystko”

    == & gt; Wszystkie wiersze, które chcesz zachować, mają zakładkę

  2. Przejdź do Menu „Szukaj - Zakładka - Odwróć zakładkę”

    == & gt; Wszystkie linie, które chcesz usunąć, są zaznaczone.

  3. Przejdź do Menu „Szukaj - Zakładka - Usuń zaznaczone linie”

    == & gt; Wszystkie zaznaczone linie zostaną usunięte.

stema
źródło
39
+1. Miło, nie wiedziałem o tym. Istnieją także opcje „Usuń nieoznaczone linie” lub „Wytnij / skopiuj zaznaczone linie”, które mogą zaoszczędzić trochę czasu.
deizel
5
Na początku miałem kłopoty, ponieważ moja wersja (6.2.3) Notepad ++ nie ma elementu menu o nazwie „Mark Tab”. Zamiast tego musisz przejść do „Szukaj” - & gt; „Znajdź ...” - & gt; kliknij zakładkę „Zaznacz”. I nie musisz już odwracać zakładek. Notepad ++ ma teraz „Usuń nieoznaczone linie”. Ale twoja wskazówka bardzo mi pomogła! Dzięki!
Adam
18
Możesz pominąć krok 2, ponieważ możliwe jest (przynajmniej od wersji 6.4.5) wybranie opcji „Usuń nieoznaczone linie”.
Nailuj
4
Używam Notepad ++ tak długo i nigdy wcześniej nie wiedziałem, co to są „Zakładki”. Niesamowite, jak potężne jest to narzędzie i jak niewiele o nim wiem.
Danubian Sailor
Jesteś geniuszem. jest to kolejny szokujący przykład tego, jak poznać prawdziwe narzędzie, którego używasz.
Marcello Grechi Lins
59

Można to zrobić w dwóch krokach od 6.3. Myślę, że można to zrobić wcześniej niż miałem 5,9, kiedy po raz pierwszy go wypróbowałem.

Używanie posta stema jako podstawy tej odpowiedzi. Teraz jest o jeden krok mniej. Zaznacz linie i usuń nieoznaczone linie. Gotowe. Szczegółowe instrukcje znajdują się poniżej.

  1. Menu wyszukiwania „Znajdź”. W oknie dialogowym Znajdź kliknij kartę „Zaznacz”. Aktywuj wyrażenia regularne. Wyszukaj ^ (^ dotyczy początku linii). Nie zapomnij zaznaczyć „Linie zakładek” i naciśnij „Zaznacz wszystko”

    == & gt; Wszystkie wiersze, które chcesz zachować, mają zakładkę

  2. Menu wyszukiwania - & gt; Dodaj do zakładek - & gt; Usuń nieoznaczone linie.

    == & gt; Wszystko NIE Zaznaczone linie są usuwane.

Recognizer
źródło
2
Zajęło mi to 10 sekund, podczas gdy inne rozwiązanie zajęło mi> 20 sekund. Dzięki!
Black
25

Wyczyść rozwiązanie oparte wyłącznie na regex

Wariant dwuetapowy

  1. zastąpienie wyrażenia regularnego

    (?!^.*test.*$)^.+
    

    zamień test na żądany tekst

  2. zastąpić

    [\r\n]{2,}
    

    z \r\n

Wariant jednoetapowy

Posługiwać się ^(?!<Path>).*\r\n zastąpić mecze pustym łańcuchem. Uogólniona wersja byłaby ^(?!.*?test).*\r\n. To nie usunie pustej linii na końcu pliku. Wszystkie inne linie są usuwane, w tym wiele kolejnych pustych linii.

Wyjaśnienie:

  1. (?!) jest negatywnym spojrzeniem w górę. ^.*test.*$ wybiera całą linię zawierającą żądany tekst.

  2. [\r\n]{2,} pasuje do dowolnego \r\n to występuje więcej niż raz, gdy jest to nowa linia systemu Windows. jeśli masz Linuksa lub inny system operacyjny, możesz z tym zepsuć. drugi to zastąpienie go jedną linią powrotną.

sonar0m
źródło
1
Uwaga dla ludów: Czasami wyrażenie regularne z końcem linii (EOL) „nie działa”. The \r\n EOL wspomniany w poście jest tym, którego używa system Windows, dlatego może być tym, czego szukasz. Często w środowiskach Linuksa to po prostu \nlub tylko w środowiskach Mac \r, więc jeśli ściągniesz plik z jednego, nie będzie to EOL w stylu Windows. Jeśli jednak pobierasz przez FileZilla i wyzwala tryb ASCII, może to zmienić z powrotem do Windows EOL (lubić \n w \r\n ). Jeśli więc wyrażenie regularne nie działa, sprawdź styl EOL, przechodząc do opcji „Wyświetl & gt; Pokaż symbole”; CR = \r. LF = \n.
dhaupin
5

Wydaje mi się, że najłatwiejszym sposobem jest użycie funkcji „Znajdź wszystko w bieżącym dokumencie”, a następnie skopiowanie wyników do nowego pliku lub zaznaczenie wszystkich i zastąpienie w bieżącym.

Odnalazłoby to wszystkie linie zawierające Twój tekst i wyświetli je na dole. Kliknij prawym przyciskiem myszy wynik wyszukiwania i skopiuj / wklej.

Gubbins
źródło
Musisz usunąć numery linii, zastępując je \tLine [\d]*: . Wciąż świetna odpowiedź.
Noumenon
4

Przejdź do menu Szukaj - & gt; Odnaleźć... - & gt; Aktywuj wyrażenia regularne. Wyszukaj „^ Ścieżka „(^ oznacza początek linii).

Kliknij przycisk „Znajdź wszystko w bieżącym dokumencie”.

Pojawi się okno „Znajdź wynik” ze wszystkimi liniami wzoru. Wybierz skopiowanie / wklejenie ich do nowej karty w Notatniku ++.

W tej nowej zakładce przejdź do: menu Szukaj - & gt; Zastąpić... - & gt; Aktywuj wyrażenia regularne.

W polu „Znajdź:” użyj wzoru: „Linia d +:”. Pozostaw puste pole „Zamień na:”.

Kliknij przycisk „Zastąp wszystko”.

Luis
źródło
3

Zapewnienie, że rzeczywiście chcesz się dopasować <Path> a nie ścieżką systemu plików, możesz spróbować tego z linii poleceń używając Perla:

perl -pe " if ($_ !~ /<Path>/) { s/$_// } " < in.txt > out.txt

Współpracował z Strawberry Perl w systemie Windows, więc dostosuj odpowiednio, jeśli wyniki nie są zgodne z oczekiwaniami.

Joe Internet
źródło
3

Jest niezgrabny, ale skopiuj to wszystko Przewyższać , a następnie użyj =IF(LEFT(A1,6)="<Path>",A1,"") i skopiuj tę formułę w dół. Następnie skopiuj to z powrotem do Notepad ++. To nie jest idealne, ale jest całkiem łatwe (jeśli masz Excela). Ostrzeżenie: Nie zadziała dobrze z liniami wciętymi (Excel przesunie kolumny itp.).

soandos
źródło
Kiedy istnieje wiele sposobów bezpośredniego radzenia sobie z tym zadaniem, dlaczego chcesz niszcząco kopiować do innej aplikacji, przetwarzać ją i przesyłać z powrotem?
Baldrickk
1

Z Notepad ++ nie ma łatwego sposobu na zrobienie tego, co chcesz. Musisz albo pobrać program na swój komputer, albo skrypt w VB (zakładam, że jesteś w systemie Windows).

Możesz zrobić to, co chcesz, na dwa sposoby za pomocą sed. Narzędzie sed jest ulubionym na * nix i można je znaleźć dla Windows od wielkich ludzi z GnuWin ( http://gnuwin32.sourceforge.net/packages/sed.htm ). Możesz pobrać ten program, a następnie uruchomić polecenie z wiersza polecenia.

Usuń wszystkie linie niezawierające:
sed -i '/^<PATH>/!d' file

Wydrukuj wszystkie linie zawierające nowy plik:
sed -n '/^<PATH>/p' file > newfile

Sugeruję, abyś użył wydruku linii, które chcesz dodać do nowego pliku. Powodem tego jest to, że prawdopodobnie nie otrzymasz instrukcji regex po raz pierwszy. Narzędzie sed używa składni podstawowej wyrażenia regularnego (zobacz odwołanie w http://www.regular-expressions.info/reference.html ). Jeśli jest coś w rodzaju ścieżki * nix (/ var / www), musisz uciec znaku /, aby działał wyrażeń regularnych.

Przykład: sed -n '/^\/var\/www/p' file > newfile
Spowoduje to wydrukowanie wszystkich linii zaczynających się od '/ var / www'. Jeśli zgłosiłem się do ucieczki znaku /, to polecenie spowodowałoby błąd. Możesz uciec ze specjalnego znaku (takiego jak /) z postacią odwrotnego ukośnika.

Chris Ting
źródło
To może być stara odpowiedź, ale ponieważ w rzeczywistości ma niewiarygodnie 2 głosy (teraz ode mnie -1) chciałem skomentować nie tylko to, jak to jest złe, ale powtarzam w POJEDYNCZYM poleceniu, jak właśnie (ponownie) wziąłem wiersz pliku dziennika do 34 wierszy zawierających jedno słowo (lub wyrażenie) w tym przypadku po prostu „błąd” w czasie poniżej 3 sekund po prostu umieszczając to wyrażenie regularne w ZNAJDŹ CO: ^ (?!. *? błąd). * \ t i pozostawiając REPLACE WITH blank, i NIE zaznaczaj „. matches newline” i kliknij „REPLACE ALL”. Tak, kocham też sed i awk, ale twierdzenie, że NPP nie może tego zrobić, jest po prostu fałszywe.
Collin Chaffin
1

Lepsze rozwiązanie z użyciem regex:

(?!^.*SOMETEXT.*$)^.+\r?\n

I zastąp z niczym

LoneDev
źródło
Witamy w Super Użytkowniku! Staraj się to wyjaśnić tym, którzy mogą nie wiedzieć, co robi każdy bit wyrażenia regularnego? :)
bertieb
0

Użyj opcji Szukaj- & gt; Zastąp i wprowadź wyrażenie regularne, takie jak ^[^ ].* i zastąp wszystko pustym łańcuchem za pomocą Regular expression. Następnym krokiem jest znalezienie pustych linii szukających \n\n wymiana z \n za pomocą Extended wiele razy do 0 occurrences were found. (posługiwać się \r\n\r\n i \r\n w zależności od formatu pliku). Jeśli masz bardzo wiele pustych wierszy z rzędu, jest to trudniejsze w użyciu \n\n\n\n\n\n\n lub nawet więcej \n: s w ciągu wyszukiwania.

AndersTornkvist
źródło