12 votes

Bloc-notes : supprimer les lignes en double

Comment supprimer les lignes dupliquées dans notepad++ ? Je vois quelques exemples mais beaucoup datent de plusieurs années et les solutions ne fonctionnent plus aujourd'hui.

image

Disons que j'avais :

Example
Example
1
1
3

souhaités :

Example
1
3

Je ne semble pas avoir de gestionnaire de plugins dans notepad++ ou TextFx Tools en version 32 bits.

23voto

Anaksunaman Points 14675

J'ai proposé plusieurs solutions possibles à votre attention. Veuillez m'excuser si je reviens sur un point que vous connaissez déjà =)

TL;DR

Depuis Notepad++ v7.7.1, Notepad++ dispose d'une fonction appelée Supprimer les lignes consécutives en double qui fait la même chose que les deux autres solutions données ci-dessous (c'est-à-dire qu'elle supprime les lignes consécutives dupliquées).

On peut y accéder avec Opérations de modification des lignes Supprimer les lignes consécutives en double .


Véase Réponse de Bartleby ci-dessous pour un exemple d'expression régulière qui dédupliquera les lignes sans les trier.


Réponse originale

Selon le commentaire de @máté-juhász, la réponse acceptée est la suivante Question StackOverflow fonctionnera avec votre exemple de données.

En résumé :

  • Ouvrir Remplacer la recherche... ( Ctrl + H ) dans Notepad++.

  • Dans le champ "Find what :", entrez ce qui suit expression régulière :

     ^(.*?)$\s+?^(?=.*^\1$)
  • Laissez le champ "Remplacer par :" vide et assurez-vous de cocher "Expression régulière" dans les options "Mode de recherche".

  • Une fois que vous êtes prêt à supprimer vos lignes, cliquez sur "Remplacer tout".

Notez que la réponse originale semble indiquer que le . matches newline devrait être cochée, mais certaines personnes dans les commentaires ont apparemment eu plus de chance en la laissant décochée. Pour vos données, je l'ai laissée décochée et cela semble bien fonctionner.

ex. Utilisation d'expressions régulières

Regex Replacement Example


Utilisation d'uniq

Si aucune autre option ne répond à vos besoins, vous pouvez utiliser un portage Windows de l'application Unix uniq vous pourriez éventuellement l'intégrer dans votre flux de travail avec Notepad++.

En bref, uniq remplit la même fonction que l'expression régulière ci-dessus, mais d'une manière potentiellement plus fiable. L'inconvénient est que l'incorporer dans Notepad++ est un peu difficile. Cela dit, si vous souhaitez tenter l'expérience, les étapes de base sont décrites ci-dessous.

Obtenir uniq

Pour commencer, vous avez besoin d'une copie de uniq pour Windows. Plusieurs options peuvent s'offrir à vous mais, pour plus de simplicité, je vous propose la solution suivante Paquet GnuWin32 CoreUtils qui comprend uniq . Vous pouvez actuellement télécharger un installateur léger si vous choisissez de ne pas télécharger et combiner vous-même les versions zippées des composants du paquet CoreUtils.

En guise de conseil, pour chaque étape de la solution impliquant l'utilisation de uniq Je n'utiliserais pas les chemins d'accès avec des espaces. Unix traite souvent les espaces dans les noms de répertoires différemment de Windows, de sorte que les utilitaires portés depuis cet environnement peuvent avoir des problèmes avec eux.


Pour référence, je ne suis pas sûr des limites de taille de fichier (s'il y en a) qui s'appliquent à la version GnuWin32 de uniq mais je l'utilise souvent pour des fichiers texte contenant au moins plusieurs mégaoctets de données (souvent plusieurs centaines de milliers de lignes) avec facilité.


Utiliser uniq avec Notepad++

Une fois uniq est installé, placez quelque chose de similaire aux lignes suivantes dans un fichier batch :

C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()

Enregistrez ce fichier batch dans un répertoire permanent qui vous convient. À titre de référence, j'appellerai ce fichier uniq_npp.bat . Notez que "temp" peut être n'importe quel dossier, mais que "tmp" et "temp" existent déjà souvent sous Windows. De même, "uniq_tmp.txt" peut être le nom que vous souhaitez, tant qu'il est utilisé de manière cohérente.

Après l'enregistrement uniq_npp.bat Nous sommes alors prêts à intégrer ses fonctionnalités dans Notepad++. Pour ce faire, ouvrez le fichier Notepad++ Courir... menu ( F5 ) et saisissez quelque chose de similaire à ce qui suit dans le champ qui apparaît :

cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"

Vous pouvez tester votre commande Notepad++ avant de l'enregistrer en cliquant sur le bouton "Exécuter" le plus à gauche.

ex. Exécuter... Dialogues

Run Dialog Example

Sinon, cliquez sur "Enregistrer..." et donnez un nom approprié à votre commande. Vous pouvez lui donner un raccourci clavier si vous le souhaitez, mais ce n'est pas obligatoire. Cliquez sur "OK" pour conserver les paramètres de votre commande et placez-la dans la section Courir... pour une utilisation ultérieure.

ex. Exécuter le menu déroulant

Run Menu Entry Example


En supposant que cela vous intéresse, j'ai un très bref aperçu des détails de la façon dont la uniq dans la section "Notes" à la fin de cette réponse.


Mises en garde

Une chose importante à retenir à propos de ces solutions avec uniq est qu'il exige absolument un chemin d'accès à un fichier enregistré sur le disque (le document ne peut pas être ouvert uniquement dans Notepad++).

Ce n'est pas un problème avec un fichier existant que vous avez ouvert, mais si vous créez un nouveau fichier ou modifiez un original existant, vous devez Économiser avant d'exécuter votre uniq_npp.bat fichier. Dans le cas contraire, l'opération échouera et les nouvelles données ne seront pas triées.

Comme petit avantage, il est probablement utile de mentionner que cette limitation d'enregistrement ne s'applique pas à l'option d'expression régulière ci-dessus.


備考

Tri

Les solutions proposées (c'est-à-dire l'expression régulière initiale et les uniq ) exigent tous deux que les lignes en double apparaissent directement l'une au-dessus de l'autre pour être supprimées, par exemple :

duplicate line X
duplicate line X

Cela signifie qu'il est important de trier vos données avant d'appliquer l'une de ces opérations. Je suppose que vous le faites déjà étant donné les données de votre exemple, mais cela vaut la peine d'être mentionné.

Macros Notepad++

Comme Notepad++ n'a pas de raccourcis clavier pour ses opérations de tri de lignes intégrées, vous pouvez enregistrer une macro pour faciliter le tri. En particulier, vous pouvez enregistrer une macro Modifier Sélectionner tout ( Ctrl + A ) et choisissez ensuite l'une des opérations Modifier les opérations sur les lignes Trier les lignes de manière lexicographique options.

Pour les uniq il peut également être utile d'envisager l'enregistrement d'une opération "Enregistrer" en tant qu'étape finale d'une macro de tri. Notez également que les étapes de l'option d'expression régulière (ouverture de la boîte de dialogue Remplacer, saisie de l'expression régulière, etc.) peuvent également être enregistrées dans une macro pratique.

Comment fonctionne la solution uniq

En bref :

  • La ligne "Exécuter..." ouvre une fenêtre de commande ( cmd /k ), appelle uniq_npp.bat et lui donne le chemin d'accès à l'endroit où est stocké le fichier que vous avez sélectionné.

  • En uniq_npp.bat , ce chemin est capturé par l'intermédiaire du %* transmis à l'option uniq . Les données dédupliquées de uniq est ensuite redirigée ( > ) vers "uniq_tmp.txt".

  • Enfin, le fichier batch ouvre ce tet nettoyé dans un nouvel onglet de Notepad++ et la fenêtre de commande est fermée via exit() .

uniq_npp.bat Améliorations ( ?)

En ce qui concerne le tri, une autre option consiste à ne pas utiliser Notepad++ pour trier les choses. Vous perdez potentiellement un peu de flexibilité dans le processus en ce qui concerne les options de tri, mais vous pouvez simplement trier les éléments en tant qu'étape supplémentaire dans votre fichier batch via l'option Tri des fenêtres commandement. Pour ajouter cette étape, vous pouvez modifier la première ligne de la commande uniq_npp.bat comme suit :

sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt

Il s'agit simplement d'acheminer les données triées à partir de sort a uniq . Comme vous pouvez le constater, sort capture désormais initialement le chemin des données, au lieu de uniq .

Une autre idée est d'utiliser (éventuellement) la fonction %* dans le cadre d'une opération sur une chaîne de caractères pour obtenir le nom de fichier original et remplacer par exemple "uniq_tmp.txt" par quelque chose comme "nom-de-fichier-original_uniq.txt" pour le rendre plus... unique.

Pièges potentiels

  • Par défaut, Windows sort triera les nombres comme par exemple

     1
     11
     2
     21

s'ils ne sont pas précédés de 0 (par ex. 01, 02, 011, 021 ).

  • Bien que le paquetage GnuWin32 CoreUtils soit livré avec un portage de l'application Tri Unix (qui dispose d'options plus robustes que l'utilitaire Windows sort ), cette implémentation particulière (contrairement à la plupart des utilitaires de GnuWin32) me semble un peu pauvre sous Windows. Cependant, si vous utilisez un portage Windows différent de la version Unix de sort il se peut que cette question ne s'applique pas et qu'il s'agisse d'une meilleure option dans l'ensemble.

2voto

J'ai constaté que cela fonctionne bien pour les articles qui ne sont pas dans l'ordre :

Recherche : (?s)^(.*?)$\s+?^(?=.*^\1$)

Remplacer par rien.

1voto

Abei Villafane Points 41

Merci, mais regex et uniq n'ont détecté que les lignes en double situées l'une à côté de l'autre. En utilisant ce awk script à la place comme awkuniq-npp.bat, il est compatible avec Notepad++. Fichier bat de 4 lignes :

C:\\pathto\\awk.exe '(a\[$0\]++==0)' %\* > %\*.1
del %\*
move %\*.1 %\*
exit()Commande à exécuter :

cmd /k C:\\pathto\\awkuniq-npp.bat "$(FULL\_CURRENT\_PATH)"

Il utilise la fonction de rechargement automatique après suppression/déplacement pour remplacer le même nom de fichier.

0voto

Maddin Points 141

J'utilise la regex de recherche/remplacement suivante (après avoir trié les lignes), je la trouve plus intuitive à comprendre :

Find: (.*)\r?\n(\1\r?\n)+

Replace with: \1\r\n

Explication :
- recherche "n'importe quoi" (une ligne de texte) suivi d'une nouvelle ligne ( \n o \r\n ) : . \r ? \n
- conserver le contenu de la ligne dans une variable : (.
) \r ? \n
- rechercher les répétitions de la même ligne une ou plusieurs fois : (.*) \r ? \n ( \1\r ? \n )+

R - Remplacer tous les éléments ci-dessus par la ligne elle-même et la nouvelle ligne : \1\r\n

J'espère que cela vous aidera,
sb3k

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X