Supprimer toutes les lignes du Bloc-notes ++, à l'exception des lignes contenant un mot dont j'ai besoin?

201

J'ai un fichier texte et je veux que les lignes commencent avec <Path>, et supprimer toutes les autres lignes.

Comment puis-je le faire?

wonea
la source
Connexes: stackoverflow.com/questions/8264391/…
Cees Timmerman
1
Le plugin LineFilter2 est également facile à utiliser.
Karsten

Réponses:

292

Il existe un moyen simple d'y parvenir. Vous devez effectuer 3 étapes.

  1. Allez dans le menu Rechercher> Rechercher ...> Sélectionnez l'onglet "Marquer". Activer les expressions régulières. Rechercher ^<Path>( ^est pour début de ligne). N'oubliez pas de cocher "Signet lignes" et appuyez sur "Marquer tout"

    ==> Toutes les lignes que vous souhaitez conserver ont un signet

  2. Aller au menu "Rechercher - Signet - Signet Inverse"

    ==> Toutes les lignes que vous souhaitez supprimer sont marquées d'un signet.

  3. Aller au menu "Rechercher - Signet - Supprimer les lignes signetées"

    ==> Toutes les lignes marquées d'un signet sont supprimées.

stema
la source
47
+1 Nice, je ne savais pas à ce sujet. Il existe également des options pour "Supprimer les lignes non marquées" ou "Couper / copier les lignes marquées" qui peuvent vous faire gagner du temps.
deizel
6
J'ai eu des problèmes au début parce que ma version (6.2.3) de Notepad ++ ne contient pas d'élément de menu appelé "Mark Tab". Au lieu de cela, vous devez aller dans "Rechercher" -> "Rechercher ..." -> cliquer sur l'onglet "Marque". Et vous n'avez plus besoin d'inverser les signets. Notepad ++ a maintenant "Supprimer les lignes non marquées". Mais ton astuce m'a beaucoup aidé! Merci!
aakoch
22
Vous pouvez ignorer l'étape 2, car il est possible (du moins depuis la version 6.4.5) de choisir "Supprimer les lignes non marquées".
Julian
4
J'utilise Notepad ++ depuis si longtemps et je n'ai jamais su ce que sont les "Signets" auparavant. Incroyable de la puissance de cet outil et du peu que j'en sais.
Danubian Sailor
Tu es un génie. Ceci est juste un autre exemple choquant de la façon de connaître réellement l’outil que vous utilisez.
Marcello Grechi Lins
67

Cela peut être fait en deux étapes à partir de 6.3. Je pense que cela peut être fait plus tôt que cela car j'avais la version 5.9 lorsque je l'ai essayée pour la première fois.

Utiliser stema's post comme base de cette réponse. Il y a un pas de moins maintenant. Marquez les lignes et supprimez les lignes non marquées. Terminé. Des instructions détaillées suivent.

  1. Menu de recherche "Rechercher". Dans la boîte de dialogue Rechercher, cliquez sur l'onglet "Marque". Activer les expressions régulières. Rechercher ^<Path>( ^est pour début de ligne). N'oubliez pas de cocher "Signet lignes" et appuyez sur "Marquer tout"

    ==> Toutes les lignes que vous souhaitez conserver ont maintenant un signet

  2. Menu de recherche -> Signet -> Supprimer les lignes non marquées.

    ==> Toutes les lignes non signées sont supprimées.

Recognizer
la source
3
Cela m'a pris 10 secondes, tandis que l'autre solution m'a pris> 20 secondes. Merci!
Black
Je n'ai pas eu besoin d'ajouter le ^dans mon terme de recherche, ni d'utiliser une expression régulière. J'espère que ça aide quelqu'un.
sa_leinad
29

Nettoyez uniquement la solution regex

Variante en deux temps

  1. regex remplacer

    (?!^.*test.*$)^.+
    

    remplacez test par votre texte demandé

  2. remplacer

    [\r\n]{2,}
    

    avec \r\n

Variante à une étape

Utiliser ^(?!<Path>).*\r\npour remplacer les correspondances par une chaîne vide. La version généralisée serait ^(?!.*?test).*\r\n. Cela ne supprimera pas la ligne vide à la fin du fichier. Toutes les autres lignes sont supprimées, y compris plusieurs lignes vides consécutives.

Explication:

  1. (?!)est un regard négatif. ^.*test.*$ sélectionne toute la ligne contenant le texte demandé.

  2. [\r\n]{2,}correspond à tout ce \r\nqui se produit plus d'une fois, c'est la nouvelle ligne Windows. Si vous avez Linux ou un autre système d'exploitation, vous devrez peut-être vous embêter avec cela. la seconde consiste à le remplacer par une ligne de retour.

sonar0m
la source
1
Note aux peuples: Parfois, les expressions rationnelles avec fin de ligne (EOL) "ne fonctionnent pas". L’ \r\nEOL mentionné dans le message est ce que Windows utilise et peut donc ne pas être ce que vous recherchez. Souvent, dans les environnements Linux, c'est juste \n, ou dans les environnements Mac \r, alors si vous extrayez un fichier, ce ne sera pas du style Windows EOL. Toutefois, si vous téléchargez via FileZilla et que des déclencheurs en mode ASCII sont utilisés, ils risquent de revenir dans EOL Windows (comme \ndans \r\n). Donc, si regex ne fonctionne pas, vérifiez le style EOL en allant dans "Affichage> Afficher les symboles> Afficher la fin de la ligne". CR = \r. LF = \n.
dhaupin
5

Il me semble que le moyen le plus simple consiste simplement à utiliser la fonction "Tout rechercher dans le document actuel", puis à copier les résultats dans un nouveau fichier ou à les sélectionner tous et à les remplacer dans le fichier actuel.

Cela trouverait toutes les lignes contenant votre texte et les listerait en bas. Faites un clic droit sur le résultat de la recherche et copiez / collez.

Gubbins
la source
Vous devez supprimer les numéros de ligne en les remplaçant \tLine [\d]*: . Encore une bonne réponse.
Noumenon
Cela ne fonctionnera pas pour les lignes si larges que Notepad ++ le tronque dans la fenêtre des résultats de la recherche.
MasterJoe2
4

Allez dans le menu Rechercher -> Rechercher ... -> Activer les expressions régulières. Recherchez "^ Path " (^ correspond au début de la ligne).

Cliquez sur le bouton "Tout trouver dans le document actuel".

La fenêtre "Find result" apparaîtra avec toutes les lignes du motif. Sélectionnez les copier / coller dans un nouvel onglet dans Notepad ++.

Dans ce nouvel onglet, allez dans: menu Recherche -> Remplacer ... -> Activer les expressions régulières.

Dans le champ "Rechercher:", utilisez le modèle: "Ligne \ d +:". Laissez le champ "Remplacer par:" vide.

Cliquez sur le bouton "Remplacer tout".

Luis
la source
3

À condition que vous souhaitiez réellement faire correspondre <Path>et non un chemin de système de fichiers, vous pouvez essayer à partir d'une ligne de commande à l'aide de Perl:

perl -pe " if ($_ !~ /<Path>/) { s/$_// } " < in.txt > out.txt

Cela fonctionnait avec Strawberry Perl sous Windows, ajustez-le en conséquence si les résultats ne sont pas ceux que vous attendez.

Joe Internet
la source
3

C'est maladroit, mais copiez le tout dans Excel , puis utilisez =IF(LEFT(A1,6)="<Path>",A1,"")et copiez cette formule jusqu'au bout. Ensuite, recopiez-le dans Notepad ++. Ce n’est pas idéal, mais c’est assez facile (si vous avez Excel). Attention: Cela ne fonctionnera pas bien avec les lignes en retrait (Excel décale les colonnes, etc.).

soandos
la source
Quand il y a plusieurs façons de gérer cette tâche directement, pourquoi voudriez-vous copier de manière destructive dans une autre application, y traiter et transférer à nouveau?
Baldrickk
1

Il n'y a pas de moyen facile de faire ce que vous voulez avec Notepad ++. Vous devrez soit télécharger un programme sur votre ordinateur, soit écrire un script en VB (je suppose que vous êtes sous Windows).

Vous pouvez faire ce que vous voulez de deux façons avec sed. L'utilitaire sed est un favori sur * nix et peut être trouvé pour Windows par les gens formidables de GnuWin ( http://gnuwin32.sourceforge.net/packages/sed.htm ). Vous souhaitez télécharger ce programme, puis exécuter votre commande à partir de l'invite de commande.

Supprimer toutes les lignes ne contenant pas:
sed -i '/^<PATH>/!d' file

Imprimer toutes les lignes contenant un nouveau fichier:
sed -n '/^<PATH>/p' file > newfile

Je vous suggère d'utiliser imprimer les lignes que vous voulez dans un nouveau fichier. La raison en est que vous n'obtiendrez probablement pas la déclaration regex pour la première fois. L'utilitaire sed utilise la syntaxe de base des expressions régulières (voir la référence à l' adresse http://www.regular-expressions.info/reference.html ). Si quelque chose ressemble à un chemin * nix (/ var / www), vous devrez échapper au caractère / pour que votre expression rationnelle fonctionne.

Exemple: sed -n '/^\/var\/www/p' file > newfile
Ceci affichera toutes les lignes commençant par '/ var / www'. Si je classais pour échapper le caractère /, alors la commande aurait jeté une erreur. Vous pouvez échapper à un caractère spécial (tel que /) avec le caractère barre oblique inversée \.

Chris Ting
la source
C'est peut-être une vieille réponse, mais comme elle a incroyablement 2 votes (-1 maintenant de ma part), je voulais commenter non seulement à quel point c'est faux, mais réitérer dans une opération de commande SINGLE comment je venais (encore) de prendre une ligne> 100k log file jusqu'aux 34 lignes contenant le mot (ou la phrase) dans ce cas simplement "erreur" en moins de 3 secondes en plaçant simplement cette expression rationnelle dans le message FIND WHAT: ^ (?!. *? error). * \ r \ n et en laissant REMPLACER AVEC vide, ne sélectionnez PAS ". correspond à la nouvelle ligne" et cliquez sur "REMPLACER TOUT". Oui, j'aime aussi sed et awk, mais dire que les centrales nucléaires ne peuvent pas faire cela est faux.
Collin Chaffin
1

Une meilleure solution avec regex remplace:

(?!^.*SOMETEXT.*$)^.+\r?\n

Et remplacer avec rien

LoneDev
la source
1
Bienvenue sur Super User! Voulez-vous expliquer cela à ceux qui ne savent peut-être pas ce que chaque partie de la regex fait? :)
bertieb
0

Utilisez Rechercher-> Remplacer et entrez une expression régulière comme ^[^ ].*, par exemple, remplacez tout par une chaîne vide Regular expression. L' étape suivante est de trouver des lignes vides recherche de \n\nremplacement à l' \naide de Extendedplusieurs fois jusqu'à ce que 0 occurrences were found.( l' utilisation \r\n\r\net \r\nselon le format de fichier). Si vous avez beaucoup de lignes vides dans une ligne, il est plus rapide d’utiliser \n\n\n\n\n\n\nou même plus \n: s dans la chaîne de recherche.

AndersTornkvist
la source