如何在 Sublime Text 2 中过滤文件中包含字符串的行?

如何在 Sublime Text 2 中过滤文件中包含字符串的行?

我想过滤我在 Sublime Text 2 中编辑的文件,查找包含特定字符串的行,如果可能的话包括正则表达式。

考虑以下文件:

foo bar
baz
qux
quuux baz

当对 进行过滤时ba,结果应为:

foo bar
baz
quuux baz

我怎样才能做到这一点?

答案1

还有一个穷人的线路过滤算法(或者是懒惰?):

  1. 选择感兴趣的字符串
  2. 在所有情况下按Alt+F3进入多光标模式
  3. Control+L选择整行(在每条光标行上)
  4. 点击Esc离开搜索输入字段。
  5. 将选择内容复制粘贴到另一个缓冲区。
  6. (如果需要)删除空行。例如,通过对行进行排序并删除空行,或使用Edit -> Permute Lines -> Unique并删除剩余的单行。

答案2

Sublime Text 2 是一款可扩展的编辑器,具有Python API。您可以创建新的命令(称为插件) 并使其可从 UI 中使用。

添加基本​​过滤 TextCommand 插件

在 Sublime Text 2 中,选择工具 » 新插件并输入以下文本:

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)

另存filter.py~/Library/Application Support/Sublime Text 2/Packages/User

与 UI 集成

要将此插件添加到编辑菜单,选择偏好设置… » 浏览软件包并打开User文件夹。如果不存在名为的文件Main.sublime-menu,请创建它。向该文件添加或设置以下文本:

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

这将插入filter命令调用(本质上,filter转换FilterCommand().run(…)为插件调用和筛选(菜单标签)位于wrap命令下方。请参阅步骤 11以获得更详细的解释。

Default (OSX).sublime-keymap要分配键盘快捷键,请在 OS X 或其他系统的同等系统中打开并编辑文件,然后输入以下内容:

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

这会将快捷方式分配F给该命令。


要使命令显示在命令面板,您需要Default.sublime-commands在文件夹中创建一个名为的文件(或编辑现有文件)User。语法类似于您刚刚编辑的菜单文件:

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

多个条目(用花括号括起来)需要用逗号分隔。

 行为和 UI 集成屏幕截图

该命令在实施后将过滤所有属于选择的行(整行,而不仅仅是选定的部分),或者,如果不存在选择,则过滤整个缓冲区,以获取触发命令后输入到输入字段的子字符串(默认是 — 可能无用的多行 — 剪贴板)。它可以轻松扩展以支持正则表达式,或者仅保留行不是匹配某个特定的表达式。

菜单项

菜单中的命令

命令面板条目

命令面板中带有不同标签的命令

编辑

用户输入文本来过滤文件

执行命令后的结果

添加对正则表达式的支持

要添加对正则表达式的支持,请改用以下脚本和代码片段:

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"
    }
]  

第二个插件命令,使用正则表达式进行过滤将添加至筛选菜单项。

Default.sublime-commands

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

答案3

现在有一个插入对于过滤线:https://github.com/davidpeckham/FilterLines
它允许基于字符串或正则表达式进行过滤和代码折叠。


David Peckham 的 Sublime Text 过滤插件

答案4

您可以使用 Sublime 的内置功能通过 3 到 7 次击键完成此操作(不包括要匹配的正则表达式)。

步骤 1:多选所有匹配的行

选项 1:多选包含子字符串的所有行

  1. 选择感兴趣的字符串。
  2. 按“ Alt+”F3可选择所有出现的项。
  3. 点击Ctrl+ L(将选择扩展至行)。

选项 2:选择与正则表达式匹配的所有行

  1. 按“ Ctrl+”F打开“查找”抽屉。
  2. 确保正则表达式匹配已启用(Alt+R切换)。
  3. 输入正则表达式。
  4. 按“ Alt+”Enter可选择所有匹配项。
  5. 点击Ctrl+ L(将选择扩展至行)。

第 2 步:用这些线条做一些事情

选项 1:删除所有不是已选择

  1. Ctrl+C进行复制。
  2. Ctrl+A选择全部。
  3. Ctrl+V用匹配的行替换选择。

选项 2:删除所有已选择

  1. Ctrl+ Shift+ K(删除行)。

选项 3:将选定的行提取到新文件

  1. Ctrl+C进行复制。
  2. Ctrl+N打开一个新文件。
  3. Ctrl+V粘贴。

相关内容