Вопрос или проблема
Как удалить дублирующиеся строки в Notepad++? Я вижу несколько примеров, но многие из них старые, и решения сейчас не работают.
Предположим, у меня есть:
Пример
Пример
1
1
3
Желаемый результат:
Пример
1
3
Похоже, у меня нет менеджера плагинов в 32-битной версии Notepad++ или TextFx Tools.
Я предложил несколько возможных решений для вашего рассмотрения. Пожалуйста, простите меня, если я повторяю то, что вы уже знаете. =)
Итог
Начиная с версии Notepad++ v7.7.1, в Notepad++ есть функция под названием Удалить последовательные дублирующиеся строки, которая выполняет то же самое, что и два других решения, представленных ниже (т.е. она удаляет последовательные дублирующиеся строки).
Эта функция доступна через Правка → Операции со строками → Удалить последовательные дублирующиеся строки.
См. ответ Бартлеби ниже для примера регулярного выражения, которое удаляет дубликаты строк без сортировки.
Оригинальный ответ
Согласно комментарию @máté-juhász, принятый ответ на этот вопрос StackOverflow будет работать с вашими примерными данными.
По сути:
-
Откройте Поиск → Заменить… ( Ctrl + H ) в Notepad++.
-
В поле “Найти что:” введите следующее регулярное выражение:
^(.*?)$\s+?^(?=.*^\1$)
-
Оставьте поле “Заменить на:” пустым и убедитесь, что выбрана опция “Регулярное выражение” в параметрах “Режим поиска”.
-
Когда вы будете готовы удалить ваши строки, нажмите “Заменить все”.
Обратите внимание, что первоначальный ответ, похоже, указывает на то, что опция . соответствует новой строке
должна быть отмечена, но некоторые люди в комментариях, похоже, имели больше удачи, оставив ее неотмеченной. Для ваших данных я оставил ее неотмеченной, и это, похоже, сработало хорошо.
например. Использование регулярных выражений
Использование uniq
В качестве альтернативы, если никакой другой вариант не подходит, если у вас есть порт утилиты uniq для Windows, вы можете, возможно, интегрировать это в вашу работу с Notepad++.
Кратко, uniq
выполняет ту же функцию, что и регулярное выражение выше, но возможно более надежным способом. Недостаток в том, что интеграция с Notepad++ является немного хаком. Учитывая это, если вы хотите попробовать, основные шаги приведены ниже.
Получение uniq
Для начала вам нужна копия 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
) требуют, чтобы дублирующиеся строки располагались непосредственно друг над другом, чтобы их удалить, например:
дублирующая строка X
дублирующая строка X
Это означает, что сортировка ваших данных перед применением одной из этих операций важна. Я предполагаю, что вы уже делаете это, если исходить из ваших примерных данных, но все же стоит это упомянуть.
Макросы Notepad++
Как небольшое предложение, поскольку в Notepad++ нет фактических сочетаний клавиш для его встроенных операций сортировки строк, вам может быть полезно записать макрос для помощи в сортировке. В частности, вы можете записать операцию Правка → Выбрать все ( Ctrl + A) и затем выбрать одну из опций Правка → Операции со строками → Сортировать строки лексикографически.
Для решения uniq
также может быть полезным рассмотреть возможность записи операции “Сохранить” в качестве последнего шага макроса сортировки. Также обратите внимание, что шаги для опции регулярных выражений (открытие диалога Замены, ввод регулярного выражения и т.д.) также можно записать в удобный макрос.
Как работает решение uniq
Кратко:
-
Строка “Запуск…” создает окно команд (
cmd /k
), вызывает uniq_npp.bat и передает путь к тому месту, где хранится текущий файл, который вы выбрали. -
В uniq_npp.bat этот путь захватывается с помощью подстановочного знака
%*
, переданного вuniq
. Дедуплицированные данные изuniq
затем перенаправляются (>
) в “uniq_tmp.txt”. -
Наконец, пакетный файл открывает этот очищенный текст в новой вкладке Notepad++, и окно команд закрывается с помощью
exit()
.
Улучшения uniq_npp.bat (?)
Что касается сортировки, другой вариант состоит в том, чтобы пропустить использование Notepad++ для сортировки всего вместе. Вы, возможно, потеряете некоторую гибкость в этом процессе в отношении опций сортировки, но вы можете просто сортировать элементы как дополнительный шаг в своем пакетном файле через команду sort для 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”, чтобы сделать его более… уникальным.
Потенциальные подводные камни
-
По умолчанию команда Windows
sort
будет сортировать числа как, например:1 11 2 21
если они не предшествуют 0 (например, 01, 02, 011, 021
).
- Хотя пакет GnuWin32 CoreUtils действительно поставляется с портом утилиты Unix sort (которая имеет более надежные параметры, чем Windows
sort
), эта конкретная реализация (в отличие от большинства утилит GnuWin32) кажется мне немного неплохой в Windows. Тем не менее, если вы используете другой порт Windows версииsort
из Unix, эта проблема может не применяться и может оказаться лучшим вариантом в целом.
Я обнаружил, что это хорошо работает для элементов, которые не упорядочены:
Поиск:
(?s)^(.*?)$\s+?^(?=.*^\1$)
Нажмите ‘Заменить все’, оставив поле ‘Заменить на:’ пустым.
Редактирование:
Вот шаги по порядку:
(?s)
Точка также соответствует новой строке.
^
Начало строки
(.*?)$
Установите первую группу захвата, сопоставляя ноль или более любых символов, не жадно, до первой конца строки, которую встретят.
\s+?
Сопоставьте один или более пробельных символов, не жадно
^
Начало строки (снова)
(?=
Положительный просмотр с ненарисованной группой (этот шаблон должен быть сопоставлен, но он не хранится).
.*^\1$)
Сопоставьте ноль или более символов, жадно, продолжая до новой строки, где вся строка является совпадением для первой группы захвата.
Таким образом, регулярное выражение создает группу захвата, а затем ищет все строки в документе, пока не найдет такую, которая точно совпадает с этой строкой, и заменяет оригинальную строку на ничего.
Дополнение: Я не думал об этом в тот момент, и прошу прощения у создателя Regex, но я считаю, что Скотт прав в том, что я использовал очень немного измененную версию регулярного выражения, созданного кем-то другим. Если бы я должен был угадать его происхождение, я думаю, что это, вероятно, более вероятно, что это ответ, фактически указанный по ссылке, которую он дал, которую можно найти здесь.
Так что в заключение, пожалуйста, примите мои извинения за:
- Не упомянув о заслугах, где это необходимо. Я не думал об этом в тот момент, но мне следовало бы.
- Не полностью объяснив ответ, который я предоставил, что увеличивало бы понимание кого-то о том, что происходит, чтобы он мог использовать эту информацию для других проблем.
- Не ответив на комментарий Скотта быстрее. Я не сильно экспертом в использовании этого сайта (поэтому моя низкая оценка) и не думал проверять свои уведомления до сегодняшнего дня.
Моя вина!
Спасибо, но regex и uniq только обнаружили дублирующиеся строки рядом друг с другом. Используя этот скрипт awk вместо этого как awkuniq-npp.bat, он совместим с Notepad++. 4-строчный bat файл:
C:\pathto\awk.exe '(a[$0]++==0)' %* > %*.1 del %* move %*.1 %* exit()
Команда для выполнения:
cmd /k C:\pathto\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"
Он использует автообновление после del/move для замены того же имени файла.
Я использую следующее регулярное выражение для поиска/замены (после сортировки строк), я нахожу его более интуитивно понятным:
Найти: (.*)\r?\n(\1\r?\n)+
Заменить на: \1\r\n
Объяснение:
– ищите “что угодно” (строка текста), за которой следует новая строка (\n или \r\n): .\r?\n
– сохраняйте содержимое строки в переменной: (.)\r?\n
– ищите повторения той же строки один или более раз: (.*)\r?\n(\1\r?\n)+
Замена:
– Замените все вышеперечисленное просто на саму строку и новую строку: \1\r\n
Надеюсь, это поможет,
sb3k
Регулярное выражение
(?sm)(^[^\r\n]*)[\r\n](?=.*^\1$)
Заменить на пустое
Ответ или решение
Удаление дубликатов строк в Notepad++
Notepad++ — это мощный текстовый редактор, который широко используется для редактирования кода и других текстовых файлов. Однако, если вам нужно удалить дубликаты строк в файлах, это может представлять собой небольшую проблему, особенно если вам не доступны определённые плагины или функции. В этой статье мы рассмотрим несколько простых и эффективных способов удаления дубликатов строк в Notepad++.
Способы удаления дубликатов строк
1. Встроенная функция Notepad++
Начиная с версии 7.7.1, Notepad++ предлагает встроенную функцию для удаления последовательных дубликатов строк. Чтобы использовать эту функцию, выполните следующие шаги:
- Откройте файл, содержащий дубликаты строк, в Notepad++.
- Перейдите в меню
Edit (Правка)
. - Найдите раздел
Line Operations (Операции со строками)
. - Выберите
Remove Consecutive Duplicate Lines (Удалить последовательные дубликаты строк)
.
Эта функция будет удалять только те строки, которые идут подряд. Таким образом, если ваши дубликаты разбросаны, вам может понадобиться предварительно отсортировать строки.
2. Использование регулярных выражений
Если вам необходимо удалить дубликаты строк, которые не являются последовательными, вы можете воспользоваться функцией поиска и замены с использованием регулярных выражений. Вот как это сделать:
- Откройте
Search (Поиск)
→Replace (Заменить)
(или нажмитеCtrl + H
). - В поле
Find what (Искать)
введите следующее регулярное выражение:(?s)^(.*?)$\s+?^(?=.*^\1$)
Это выражение ищет дублирующиеся строки в файле. Убедитесь, что выбран режим поиска
Regular expression (Регулярное выражение)
. - Поле
Replace with (Заменить на)
должно оставаться пустым. - Нажмите
Replace All (Заменить все)
.
Это позволит удалить все дубликаты строк, которые могут быть разбросаны по файлу.
3. Использование утилиты uniq
Если у вас установлен либо порт Unix, либо GnuWin32, вы можете использовать утилиту uniq
. Эта команда позволяет удалять дубликаты из файла, но требует, чтобы дубликаты располагались вместе, так что сначала нужно будет отсортировать строки:
- Установите GnuWin32 CoreUtils, который включает утилиты командной строки, включая
uniq
. - Создайте пакетный файл
uniq_npp.bat
, содержащий следующий код:C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt notepad++ C:\temp\uniq_tmp.txt exit()
- Затем добавьте данную команду в меню
Run (Выполнить)
Notepad++:cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"
После выполнения этой команды утилита uniq
сможет удалять дубликаты из вашего файла.
Заключение
Не важно, нуждаетесь ли вы в простом способе удаления последовательных дубликатов или в более сложном решении для файлов с раскиданными дубликатами, Notepad++ предоставляет несколько мощных инструментов для решения этой задачи. Использование встроенных функций, регулярных выражений или утилиты uniq
дает возможность эффективно очищать текстовые документы от лишней информации и структурировать их для дальнейшего использования.
Если у вас возникли вопросы или дополнительные предложения по улучшению работы с Notepad++, не стесняйтесь делиться ими в комментариях!