81 votes

Comment filtrer un fichier pour les lignes contenant une chaîne de caractères dans Sublime Text 2 ?

Je veux filtrer un fichier que j'édite dans Sublime Text 2 pour les lignes contenant une certaine chaîne, si possible en utilisant des expressions régulières.

Considérons le fichier suivant :

foo bar
baz
qux
quuux baz

Lorsqu'il est filtré pour ba le résultat devrait être :

foo bar
baz
quuux baz

Comment puis-je faire ça ?

92voto

Olof Bjarnason Points 1033

Il existe également un algorithme de filtrage des lignes du pauvre (ou est-ce paresseux ?) :

  1. Sélectionnez chaîne d'intérêt
  2. Hit Alt + F3 pour passer en mode multi-curseur sur toutes les occurrences
  3. Hit Control + L pour sélectionner la ligne entière (sur chaque ligne du curseur)
  4. Copier-coller la sélection dans un autre buffer

88voto

Daniel Beck Points 105590

Sublime Text 2 est un éditeur extensible avec une API Python . Vous pouvez créer de nouvelles commandes (appelées Plugins ) et les rendre disponibles à partir de l'interface utilisateur.

Ajout d'un plugin TextCommand de filtrage de base

Dans Sublime Text 2, sélectionnez Outils " Nouveau plugin et saisissez le texte suivant :

import sublime, sublime_plugin

def filter(v, e, needle):
    # get non-empty selections
    regions = [s for s in v.sel() if not s.empty()]

    # if there's no non-empty selection, filter the whole document
    if len(regions) == 0:
        regions = [ sublime.Region(0, v.size()) ]

    for region in reversed(regions):
        lines = v.split_by_newlines(region)

        for line in reversed(lines):
            if not needle in v.substr(line):
                v.erase(e, v.full_line(line))

class FilterCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        def done(needle):
            e = self.view.begin_edit()
            filter(self.view, e, needle)
            self.view.end_edit(e)

        cb = sublime.get_clipboard()
        sublime.active_window().show_input_panel("Filter file for lines containing: ", cb, done, None, None)

Enregistrer sous filter.py sur ~/Library/Application Support/Sublime Text 2/Packages/User

Intégration avec l'interface utilisateur

Pour ajouter ce plugin au Modifier sélectionnez Préférences " Parcourir les paquets et ouvrir le User dossier. Si un fichier appelé Main.sublime-menu n'existe pas, créez-la. Ajoutez ou définissez le texte suivant dans ce fichier :

[
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            { "command": "filter" }
        ]
    }
]

Cela permettra d'insérer le filter appel de commande (essentiellement, filter est transformé en FilterCommand().run(…) pour l'appel du plugin et Filtre pour l'étiquette du menu) juste en dessous de la wrap commandement. Voir étape 11 ici pour une explication plus détaillée de cette situation.

Pour attribuer un raccourci clavier, ouvrez et modifiez le fichier Default (OSX).sublime-keymap sur OS X, ou l'équivalent pour les autres systèmes, et entrez ce qui suit :

[  
    {   
        "keys": ["ctrl+shift+f"], "command": "filter"
    }  
]  

Cela permettra d'attribuer le raccourci F à cette commande.


Pour que la commande apparaisse dans le Palette de commandes vous devez créer un fichier nommé Default.sublime-commands (ou modifiez-en un existant) dans le User dossier. La syntaxe est similaire à celle du fichier de menu que vous venez de modifier :

[
    { "caption": "Filter Lines in File", "command": "filter" }
]

Les entrées multiples (entre crochets) doivent être séparées par des virgules.

 Captures d'écran de l'intégration du comportement et de l'interface utilisateur

La commande, telle qu'elle est implémentée, filtrera toutes les lignes qui font partie d'une sélection (les lignes entières, pas seulement les parties sélectionnées), ou, si aucune sélection n'existe, le tampon entier, pour une sous-chaîne qui est entrée dans le champ de saisie (par défaut, le presse-papiers multi-lignes - peut-être inutile - après le déclenchement de la commande). Elle peut facilement être étendue pour, par exemple, supporter les expressions régulières ou ne laisser que les lignes. no correspondant à une certaine expression.

Option de menu

Command in menu

Entrée de la palette de commandes

Command with different label in Commands Palette

Rédacteur en chef

User entering text to filter file with

Result after executing the command

Ajout du support pour les Expressions Régulières

Pour ajouter le support des expressions régulières, utilisez plutôt les scripts et snippets suivants :

filter.py :

import sublime, sublime_plugin, re

def matches(needle, haystack, is_re):
    if is_re:
        return re.match(needle, haystack)
    else:
        return (needle in haystack)

def filter(v, e, needle, is_re = False):
    # get non-empty selections
    regions = [s for s in v.sel() if not s.empty()]

    # if there's no non-empty selection, filter the whole document
    if len(regions) == 0:
        regions = [ sublime.Region(0, v.size()) ]

    for region in reversed(regions):
        lines = v.split_by_newlines(region)

        for line in reversed(lines):

            if not matches(needle, v.substr(line), is_re):
                v.erase(e, v.full_line(line))

class FilterCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        def done(needle):
            e = self.view.begin_edit()
            filter(self.view, e, needle)
            self.view.end_edit(e)

        cb = sublime.get_clipboard()
        sublime.active_window().show_input_panel("Filter file for lines containing: ", cb, done, None, None)

class FilterUsingRegularExpressionCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        def done(needle):
            e = self.view.begin_edit()
            filter(self.view, e, needle, True)
            self.view.end_edit(e)

        cb = sublime.get_clipboard()
        sublime.active_window().show_input_panel("Filter file for lines matching: ", cb, done, None, None)

Main.sublime-menu :

[
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            { "command": "filter" },
            { "command": "filter_using_regular_expression" }
        ]
    }
]

Default (OSX).sublime-keymap :

[  
    {   
        "keys": ["ctrl+shift+f"], "command": "filter"
    },
    {
        "keys": ["ctrl+shift+option+f"], "command": "filter_using_regular_expression"
    }
]  

Une deuxième commande de plugin, Filtrer en utilisant une expression régulière sera ajouté sous le Filtre entrée du menu.

Default.sublime-commands :

[
    { "caption": "Filter Lines in File", "command": "filter" },
    { "caption": "Filter Lines in File Using Regular Expression", "command": "filter_using_regular_expression" }
]

52voto

Il y a maintenant un plugin pour les lignes de filtrage : https://github.com/davidpeckham/FilterLines
Il permet de filtrer et de plier le code sur la base de chaînes de caractères ou d'expressions régulières.

Sublime Text Filter Plugin by David Peckham

15voto

Terence Simpson Points 976

Vous pouvez utiliser les capacités intégrées de Sublime pour effectuer cette opération en 3 à 7 frappes (sans compter l'expression rationnelle à faire correspondre).

Étape 1 : Multi-sélectionner toutes les lignes correspondantes

Option 1 : Pour multi-sélectionner toutes les lignes contenant une sous-chaîne

  1. Sélectionnez la chaîne de caractères qui vous intéresse.
  2. Hit Alt + F3 pour multisélectionner toutes les occurrences.
  3. Hit Ctrl + L (Étendre la sélection à la ligne).

Option 2 : Pour multi-sélectionner toutes les lignes correspondant à une regexp

  1. Hit Ctrl + F pour ouvrir le tiroir de recherche.
  2. Assurez-vous que la correspondance par expression régulière est activée ( Alt + R pour basculer).
  3. Saisissez l'expression régulière.
  4. Hit Alt + Enter pour multisélectionner toutes les correspondances.
  5. Hit Ctrl + L (Étendre la sélection à la ligne).

Étape 2 : Faites quelque chose avec ces lignes

Option 1 : Se débarrasser de toutes les lignes qui ne sont pas sélectionné

  1. Hit Ctrl + C à copier.
  2. Hit Ctrl + A pour tout sélectionner.
  3. Hit Ctrl + V pour remplacer la sélection par les lignes correspondantes.

Option 2 : Pour se débarrasser de toutes les lignes qui sont sélectionné

  1. Hit Ctrl + Shift + K (Supprimer la ligne).

Option 3 : Extraire les lignes sélectionnées vers un nouveau fichier

  1. Hit Ctrl + C à copier.
  2. Hit Ctrl + N pour ouvrir un nouveau fichier.
  3. Hit Ctrl + V à coller.

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