решение1
Я предоставил несколько возможных решений для вашего рассмотрения. Пожалуйста, простите меня, если я повторю то, что вы уже знаете. =)
TL;DR
Начиная с версии Notepad++ 7.7.1, в Notepad++ появилась функция под названиемУдалить последовательные повторяющиеся строкикоторый делает то же самое, что и два других решения, приведенных ниже (т.е. удаляет последовательные дубликаты строк).
Доступ к нему можно получить с помощьюРедактировать → Операции со строками → Удалить последовательные повторяющиеся строки.
ВидетьОтвет Бартлбиниже приведен пример регулярного выражения, которое будет дедуплицировать строки без сортировки.
Оригинальный ответ
Согласно комментарию @máté-juhász, принятый ответ на этот вопросВопрос на StackOverflowбудет работать с вашими данными примера.
По сути:
ОткрытьПоиск → Заменить...( Ctrl+ H) в Notepad++.
В поле «Найти что:» введите следующеерегулярное выражение:
^(.*?)$\s+?^(?=.*^\1$)
Оставьте поле «Заменить на:» пустым и обязательно отметьте «Регулярное выражение» в параметрах «Режим поиска».
Когда вы будете готовы удалить линии, нажмите «Заменить все».
Обратите внимание, что в оригинальном ответе, похоже, указано, что эта . matches newline
опция должна быть отмечена, но некоторым людям в комментариях, по-видимому, повезло больше, если они не отметили ее. Для ваших данных я оставил ее неотмеченной, и, похоже, это сработало хорошо.
например, использование регулярных выражений
Использование uniq
В качестве альтернативы, если ни один другой вариант вам не подходит, если у вас есть порт Windows на основе Unixуникальныйутилиту, вы могли бы интегрировать ее в свой рабочий процесс с Notepad++.
Короче говоря, uniq
выполняет ту же функцию, что и регулярное выражение выше, но потенциально более надежным способом. Недостатком является то, что включение его в Notepad++ является своего рода хаком. Имея это в виду, если вы хотите попробовать, основные шаги описаны ниже.
Получение уникальности
Для начала вам нужна копия uniq
для Windows. Вам может быть доступно несколько вариантов, но для простоты я могу предложитьПакет GnuWin32 CoreUtilsкоторый включает uniq
. В настоящее время вы можете загрузитьлегкий установщикесли вы решите не загружать и не объединять заархивированные версии компонентов пакета CoreUtils самостоятельно.
В качестве совета, для каждого шага в решении, включающем uniq
, я бы пропустил использование путей с пробелами. Unix часто обрабатывает пробелы в именах каталогов иначе, чем Windows, поэтому утилиты, портированные из этой среды, могут иметь с ними проблемы.
Для справки: я не уверен, какие ограничения на размер файла (если таковые имеются) могут применяться к сборке GnuWin32 uniq
, но я часто и без проблем использую ее для текстовых файлов, содержащих не менее нескольких мегабайт данных (часто несколько сотен тысяч строк).
Использование uniq с Notepad++
После uniq
установки поместите в пакетный файл что-то похожее на следующие строки:
C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()
Сохраните этот пакетный файл в постоянном каталоге, который вам удобен. Для справочных целей я назову егоuniq_npp.bat. Обратите внимание, что "temp" может быть любой папкой, но "tmp" и "temp" часто уже существуют в Windows. Аналогично, "uniq_tmp.txt" может быть любым именем, которое вы пожелаете, пока оно используется последовательно.
После сохраненияuniq_npp.bat, то мы готовы интегрировать его функциональность в Notepad++. Для этого откройте Notepad++Бегать...меню ( F5) и введите в появившееся поле что-то похожее на следующее:
cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"
Вы можете протестировать команду Notepad++ перед ее сохранением, нажав самую левую кнопку «Выполнить».
напр. Выполнить... Диалог
В противном случае нажмите «Сохранить...» и назовите команду соответствующим образом. Вы можете назначить ей сочетание клавиш, если хотите, но это не обязательно. Нажмите «ОК», чтобы сохранить настройки команды и поместить ее вБегать...выпадающее меню для дальнейшего использования.
напр. Выполнить выпадающее меню
Если вас это заинтересует, я дам вам краткий обзор деталей работы решения uniq
в разделе «Примечания» в конце этого ответа.
Предостережения
Важно помнить, что это uniq
решениеабсолютно необходимопуть к файлу, сохраненному на диске (документ нельзя открыть только в Notepad++).
Это не проблема с существующим файлом, который вы открыли, но если вы создаете новый файл или изменяете существующий оригинал, вам необходимоСохранятьэто прежде чем запустить вашuniq_npp.batфайл. В противном случае операция завершится неудачей и новые данные не будут отсортированы.
В качестве небольшого преимущества, вероятно, стоит упомянуть, что это ограничение сохранения не распространяется на вариант регулярного выражения, указанный выше.
Примечания
Сортировка
Предложенные решения (то есть исходное регулярное выражение и uniq
) требуют, чтобы дублирующиеся строки располагались непосредственно друг над другом, чтобы их можно было удалить, например:
duplicate line X
duplicate line X
Это означает, что сортировка данных перед применением одной из этих операций важна. Я предполагаю, что вы уже делаете это, учитывая ваши данные примера, но об этом все равно стоит упомянуть.
Макросы Notepad++
В качестве небольшого предложения, поскольку Notepad++ не имеет реальных сочетаний клавиш для встроенных операций сортировки строк, вы можете записать макрос, который поможет с сортировкой. В частности, вы можете записатьРедактировать → Выбрать все( Ctrl+ A) операцию, а затем выбрать один изРедактировать → Операции со строками → Сортировать строки лексикографическипараметры.
Для uniq
решения, возможно, стоит также рассмотреть запись операции "Сохранить" в качестве последнего шага в макросе сортировки. Также обратите внимание, что шаги для опции регулярного выражения (открытие диалогового окна "Заменить", ввод регулярного выражения и т. д.) также можно записать в удобный макрос.
Как работает уникальное решение
Вкратце:
Строка «Выполнить...» открывает командное окно (
cmd /k
), вызываетuniq_npp.batи указывает ему путь к месту хранения текущего выбранного вами файла.Вuniq_npp.bat, этот путь фиксируется с помощью
%*
подстановочного знака, переданного вuniq
. Затем дедуплицированные данные изuniq
перенаправляются (>
) в "uniq_tmp.txt".Наконец, пакетный файл открывает этот очищенный текст в новой вкладке Notepad++, а командное окно закрывается с помощью
exit()
.
Улучшения uniq_npp.bat (?)
Что касается сортировки, другой вариант — пропустить использование Notepad++ для сортировки всех вещей вместе. Вы потенциально теряете некоторую гибкость в процессе относительно параметров сортировки, но вы можете просто сортировать элементы как дополнительный шаг в вашем пакетном файле черезСортировка оконкоманда. Чтобы добавить этот шаг, вы можете изменить первую строкуuniq_npp.batследующее:
sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt
Это просто перенаправляет отсортированные данные из sort
в uniq
. Как вы можете видеть, sort
now изначально фиксирует путь данных, а не uniq
.
Другая идея — (возможно) использовать %*
подстановочный знак как часть строковой операции для получения исходного имени файла и заменить, например, «uniq_tmp.txt» на что-то вроде «original-filename_uniq.txt», чтобы сделать его более... уникальным.
Потенциальные ловушки
По умолчанию Windows
sort
сортирует числа, например, так:1 11 2 21
если им не предшествует 0 (например 01, 02, 011, 021
, ).
- Хотя пакет GnuWin32 CoreUtils поставляется с портомсортировка Unixутилита (которая имеет более надежные опции, чем Windows
sort
), эта конкретная реализация (в отличие от большинства утилит GnuWin32) кажется мне немного слабой на Windows. Однако, если вы используете другой порт Windows версии Unixsort
, эта проблема может не возникнуть и может оказаться лучшим вариантом в целом.
решение2
Я обнаружил, что это отлично работает для элементов, которые расположены не по порядку:
Поиск:
(?s)^(.*?)$\s+?^(?=.*^\1$)
Нажмите «Заменить все», не указывая ничего в поле «Заменить на:».
Редактировать:
Вот пошаговое руководство:
(?s) Точка также соответствует новой строке.
^ Начало строки
(.*?)$ Установить первую группу захвата, сопоставив ноль или более любых символов, нежадно, до первого встреченного конца строки.
\s+? Соответствует одному или нескольким пробельным символам, нежадно
^ Начало строки (снова)
(?= Положительный просмотр вперед с незахватывающей группой (этот шаблон должен быть сопоставлен, но он не сохраняется).
.*^\1$) Совпадение нуля или более символов, жадное, продолжающееся до тех пор, пока не будет найдена новая строка, где вся строка будет соответствовать первой группе захвата.
Таким образом, регулярное выражение создает группу захвата, а затем просматривает все строки в документе, пока не найдет ту, которая точно соответствует этой строке, и не заменит исходную строку ничем.
Дополнение: Я не думал об этом в то время, и я приношу извинения создателю Regex, но я считаю,Скоттправильно в том, что я использовал очень слегка измененную версию регулярного выражения, созданного кем-то другим. Если бы я угадал его происхождение, я думаю, что это, вероятно, был бы ответ, фактически указанный в ссылке, которую он дал, и которую можно найтиздесь.
Итак, в заключение, примите мои извинения за:
- Не отдал должное там, где это было необходимо. Я не думал об этом в то время, но я должен был.
- Я не полностью объяснил свой ответ, который мог бы улучшить понимание человеком происходящего, и он мог бы использовать эту информацию для решения других проблем.
- Не отвечаю на комментарий Скотта быстрее. Я не очень разбираюсь в использовании этого сайта (отсюда и моя низкая оценка) и не думал проверять уведомления до сегодняшнего дня.
Моя вина!
решение3
Спасибо, но regex и uniq обнаружили только дубликаты строк рядом друг с другом. Используя этот скрипт awk вместо awkuniq-npp.bat, он совместим с Notepad++. 4-строчный bat-файл:
C:\pathto\awk.exe '(a[$0]++==0)' %* > %*.1 дель %* двигаться %*.1 %* Выход()Команда для запуска:
cmd /k C:\pathto\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"
Он использует автоматическую перезагрузку после удаления/перемещения для замены того же имени файла.
решение4
Я использую следующее регулярное выражение поиска/замены (после сортировки строк), оно кажется мне более интуитивно понятным:
Find: (.*)\r?\n(\1\r?\n)+
Replace with: \1\r\n
Пояснение:
- ищите «что угодно» (строку текста), за которой следует новая строка (\n или \r\n): .\r?\n
- сохранить содержимое строки в переменной: (.)\r?\n
- поиск повторений одной и той же строки один или несколько раз: (.*)\r?\n(\1\r?\n)+
Замена: - Замените все вышеперечисленное только самой строкой и новой строкой: \1\r\n
Надеюсь, это поможет,
sb3k