Я представил два возможных решения для вашего рассмотрения. Пожалуйста, прости меня, если я перейду все, что ты уже знаешь. знак равно
TL; DR
Согласно комментарию @ máté-juhász, принятый ответ на этот вопрос StackOverflow будет работать с данными вашего примера.
По сути:
Открыть Поиск → Заменить ... ( Ctrl + H ) в Блокноте ++.
В поле «Найти что:» введите следующее регулярное выражение:
^(.*?)$\s+?^(?=.*^\1$)
Оставьте поле "Заменить на" пустым и обязательно отметьте "Регулярное выражение" под опциями "Режим поиска".
Когда вы будете готовы удалить свои строки, нажмите "Заменить все".
Обратите внимание, что первоначальный ответ, кажется, указывает на то, что . matches newline
опция новой строки совпадений должна быть проверена, но некоторым людям в комментариях, очевидно, повезло больше, если ее не проверять. Для ваших данных я оставил это без проверки, и это, казалось, работало хорошо.
ех. Использование регулярных выражений
uniq - Ходжест из Подж
В качестве альтернативы, предполагая, что ни одна другая опция не отвечает вашим потребностям, если у вас есть порт Windows утилиты Uniq на основе Unix, вы можете интегрировать ее в рабочий процесс с помощью Notepad++.
Короче говоря, uniq
выполняет ту же функцию, что и регулярное выражение выше, но потенциально более надежным способом. Недостатком является то, что включение его в Notepad++, возможно, немного хакерское. Имея это в виду, если вы хотите попробовать, основные шаги изложены ниже.
Получение уникального
Для начала вам нужна копия uniq
для Windows. Возможно, вам будет доступно несколько вариантов, но для простоты я могу предложить пакет GnuWin32 CoreUtils, который включает в себя uniq
. В настоящее время вы можете загрузить облегченный установщик, если решите не загружать и не комбинировать заархивированные версии компонентов пакета CoreUtils самостоятельно.
Как подсказка, для каждого шага в решении, включающем uniq
, я бы пропускал пути с пробелами. Unix часто обрабатывает пробелы в именах каталогов иначе, чем Windows, поэтому утилиты, портированные из этой среды, могут иметь проблемы с ними.
Для справки, я не уверен, какие (если таковые имеются) ограничения размера файла могут применяться к сборке uniq
GnuWin32, но я часто использую его для текстовых файлов, по крайней мере, с несколькими мегабайтами данных (часто несколькими сотнями тысяч строк).
Использование 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++. Для этого откройте меню «Блокнот ++ Выполнить ...» ( 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++ не имеет никаких реальных сочетаний клавиш для встроенных операций сортировки строк, вы можете записать макрос, чтобы помочь с сортировкой. В частности, вы можете записать операцию « Правка» → «Выбрать все» ( Ctrl + A), а затем выбрать одну из опций « Правка» → «Операции со строками» → «Сортировать линии» лексикографически .
Для решения uniq
может также стоить рассмотреть запись операции "Сохранить" в качестве последнего шага в макрос сортировки. Также обратите внимание, что шаги для опции регулярного выражения (открытие диалога замены, ввод регулярного выражения и т.д.) Также могут быть записаны в удобный макрос.
Как работает уникальное решение
Вкратце:
Строка «Run ...» порождает командное окно (cmd /k
), вызывает uniq_npp.bat и указывает путь к месту сохранения текущего выбранного файла.
В uniq_npp.bat этот путь записывается через подстановочный знак %*
переданный uniq
. Дедуплицированные данные из uniq
затем перенаправляются (>
) в "uniq_tmp.txt".
Наконец, пакетный файл открывает этот очищенный текст на новой вкладке Notepad++, а окно команд закрывается с помощью exit()
.
Улучшения uniq_npp.bat (?)
Что касается сортировки, другой вариант - пропустить использование Notepad++ для сортировки всего вместе. Потенциально вы теряете некоторую гибкость в процессе выбора параметров сортировки, но вы можете просто отсортировать элементы как дополнительный шаг в вашем пакетном файле с помощью команды сортировки Windows . Чтобы добавить этот шаг, вы можете изменить первую строку uniq_npp.bat следующим образом:
sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt
Это просто передает отсортированные данные из sort
в uniq
. Как вы можете видеть, sort
теперь изначально фиксирует путь к данным, а не uniq
.
Другая мысль состоит в том, чтобы (возможно) использовать подстановочный знак %*
как часть строковой операции для получения исходного имени файла и заменить, например, «uniq_tmp.txt» на что-то вроде «original-filename_uniq.txt», чтобы сделать его более ... уникальным , Однако мне сейчас лень предлагать, как это сделать. = Р
Потенциальные ловушки
По умолчанию sort
Windows будет сортировать числа как
1
11
2
21
если им не предшествует 0 (например, 01, 02, 011, 021
).
Имейте в виду, что, хотя пакет GnuWin32 CoreUtils поставляется с портом утилиты сортировки Unix (которая имеет более надежные параметры, чем sort
Windows), эта конкретная реализация (в отличие от большинства утилит GnuWin32) крайне плоха в Windows. Однако, если вы используете другой порт версии Unix для sort
, эта проблема может не применяться и может оказаться лучшим вариантом в целом.