6

Как удалить дубликаты строк в блокноте ++? Я вижу некоторые примеры, но многим уже много лет, и решения не работают.

образ

Скажи, что я имел:

Example
Example
1
1
3

Желаемая:

Example
1
3

У меня нет менеджера плагинов в 32-битном блокноте ++ или TextFx Tools

1 ответ1

9

Я представил два возможных решения для вашего рассмотрения. Пожалуйста, прости меня, если я перейду все, что ты уже знаешь. знак равно

TL; DR

Согласно комментарию @ máté-juhász, принятый ответ на этот вопрос StackOverflow будет работать с данными вашего примера.

По сути:

  • Открыть Поиск → Заменить ... ( Ctrl + H ) в Блокноте ++.

  • В поле «Найти что:» введите следующее регулярное выражение:

    ^(.*?)$\s+?^(?=.*^\1$)
    
  • Оставьте поле "Заменить на" пустым и обязательно отметьте "Регулярное выражение" под опциями "Режим поиска".

  • Когда вы будете готовы удалить свои строки, нажмите "Заменить все".

Обратите внимание, что первоначальный ответ, кажется, указывает на то, что . matches newline опция новой строки совпадений должна быть проверена, но некоторым людям в комментариях, очевидно, повезло больше, если ее не проверять. Для ваших данных я оставил это без проверки, и это, казалось, работало хорошо.

ех. Использование регулярных выражений

Пример замены Regex


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 , эта проблема может не применяться и может оказаться лучшим вариантом в целом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .