Odpowiedzi:
Sortuj wiersze alfabetycznie, jeśli jeszcze nie są, i wykonaj następujące kroki:
(na podstawie tego pokrewnego pytania: Jak znaleźć i usunąć zduplikowane wiersze z pliku za pomocą wyrażeń regularnych? )
Control+F
Przełącz „tryb zastępowania”
Przełącz „Użyj wyrażenia regularnego” (ikona z .*
symbolem)
W polu wyszukiwania wpisz^(.*)(\n\1)+$
W polu „ zamień na ” wpisz$1
W takim przypadku skorzystaj z rozwiązania innego niż VS Code (patrz tutaj ) lub - jeśli twój dokument nie jest bardzo duży i nie masz nic przeciwko spamowaniu przycisku Zamień wszystko - wykonaj poprzednie kroki, ale w krokach 4 i 5, wprowadź te:
(na podstawie opcji Usuń określone zduplikowane linie bez sortowania )
Uwaga: blokuje pliki ze zbyt dużą liczbą wierszy (1000+); może spowodować awarię VS Code; może w niektórych przypadkach wprowadzić puste wiersze.
szukaj :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?
zastąpić :$1
a następnie kliknij przycisk „Zamień wszystko” tyle razy, ile wystąpi duplikat .
Dowiesz się, że wystarczy, gdy liczba linii przestanie maleć po kliknięciu przycisku. Przejdź do ostatniego wiersza dokumentu, aby mieć na to oko.
^(.*)(\n\1)+$
. Po usunięciu zduplikowanych wierszy chcę spojrzeć na wszystkie wiersze ze zduplikowaną pierwszą kolumną w csv i zmienić wyrażenie regularne.
\r?
z drugiej odpowiedzi nie jest naprawdę konieczna.
Oto bardzo ciekawe rozszerzenie: Transformer
Cechy:
Aby usunąć zduplikowane linie:
Usuwa zduplikowane wiersze z dokumentu
Działa na zaznaczeniu lub bieżącym bloku, jeśli brak wyboru
Nie bawiłem się nim zbyt wiele poza poleceniem „Unikalne linie”, ale wydaje się całkiem niezłe (włączając w to próbę zarejestrowania makr!).
Aby dodać do odpowiedzi @ Marc.2377.
Jeśli kolejność jest ważna i nie obchodzi Cię, że po prostu zachowujesz ostatni ze zduplikowanych wierszy, po prostu wyszukaj następujące wyrażenie regularne, jeśli chcesz usunąć tylko zduplikowane niepuste wiersze
^(.+\n)(?=(?:.*\n)*?\1)
Jeśli chcesz również usunąć zduplikowane puste wiersze, użyj *
zamiast+
^(.*\n)(?=(?:.*\n)*?\1)
i zamień na nic.
To zajmie linię i spróbuje znaleźć więcej (może 0) linii, po których nastąpi dokładnie ta sama wybrana linia. Usunie wybraną linię.
To jest tylko jednorazowe wyrażenie regularne. Nie musisz spamować przycisku zamień.
^(.+\n)(?=(?:.*\n)*?\1)
zamiast tego, ponieważ twoje wyrażenie regularne usunęło pusty wiersz tam, gdzie nie było oczekiwane. Mimo to głosowano za.
xxx(?=…)
to lookahead-match. Dlatego zapewnia, że wszystko, co następuje po „xxx”, pasuje do „…”, ale nie przyspiesza wyszukiwania. (?:…)
jest tylko nawiasem, który nie liczy się w liczbie nawiasów. .*\n
jest wzorcem dla (prawdopodobnie pustej) linii. *
oznacza, że może być kilka linii, a nawet żadna. Te ?
po gwiazdką ( *
) oznacza, że chcemy jak kilka linii, jak to możliwe. Jak \1
następuje w tym wyrażeniu, efekt jest taki, że patrzymy w przyszłość na wszystkie wiersze, które nie pasują, \1
dopóki nie znajdziemy pasującej linii \1
. Mam nadzieję, że to wyjaśnia.
Właśnie miałem ten sam problem i znalazłem pakiet Visual Studio Code „Sort lines”. Aby uzyskać szczegółowe informacje (np. Linie sortowania ), zobacz rynek Visual Studio Code .
Ten pakiet ma opcję "Sorting lines (unique)", która zrobiła to za mnie. Uważaj na spacje na początku / końcu linii. Wpływają na to, czy linie są uważane za wyjątkowe, czy nie.
Zainstaluj rozszerzenie DupChecker , naciśnij F1i wpisz „Sprawdź duplikaty”.
Sprawdza duplikaty i zapyta, czy chcesz je usunąć.
Spróbuj znaleźć i zamienić na wyrażenie regularne .
Odnaleźć:
^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$
Zastąpić:
$1$2
W pierwszej grupie można wprowadzić pewną wariancję.
Właściwie nie w Visual Studio Code, ale jeśli działa, to działa.
To nie jest najlepsza odpowiedź, tak jak określiłeś Visual Studio Code, ale tak jak powiedziałem: jeśli działa, to działa :)
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?
spowodował awarię mojego vscode ... Zrobiłem Find in one file 229 lines. :(