【问题标题】:How to delete lines without String in Notepad++Notepad ++中如何删除没有字符串的行
【发布时间】:2019-02-19 10:32:37
【问题描述】:

我有各种日志文件,我想使用类似 grep 的功能进行过滤。

我之前的做法是:

  • 标记单词/字符串
  • 搜索/标记
    • 启用选项“书签行”
    • 全部标记
    • 关闭
  • 搜索/书签
    • “删除未标记的行”

对于这个过程,我录制了一个宏并将其存储在shortcuts.xml

<Macros>
        <Macro name="Trim Trailing and save" Ctrl="no" Alt="yes" Shift="yes" Key="83">
            <Action type="2" message="0" wParam="42024" lParam="0" sParam="" />
            <Action type="2" message="0" wParam="41006" lParam="0" sParam="" />
        </Macro>
        <Macro name="grep01" Ctrl="no" Alt="no" Shift="no" Key="0">
            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1601" wParam="0" lParam="0" sParam="IM1 001" />
            <Action type="3" message="1625" wParam="0" lParam="0" sParam="" />
            <Action type="3" message="1702" wParam="0" lParam="784" sParam="" />
            <Action type="3" message="1701" wParam="0" lParam="1615" sParam="" />
            <Action type="2" message="0" wParam="43051" lParam="0" sParam="" />
        </Macro>

是否可以将字符串 "IM1 001" 替换为通配符或实际标记的文本,然后按组合来完成这项工作?

【问题讨论】:

  • 我认为 Notepad++ 的宏不支持变量。可能有一个插件可以提供帮助(可能是 NPPExec),但如果您需要定期执行此任务,那么可能值得为它编写一个 PowerShell 脚本。
  • 谢谢,我会在 Notepad++ 社区问这个问题,也许他们可以提供帮助
  • Powershell 脚本不是我需要的。我经常将日志文件的输出复制粘贴到记事本++中。然后我想按特定单词或术语过滤行。

标签: notepad++


【解决方案1】:

EmEditor 有一个书签功能可以做到这一点。在 Find 对话框中,输入字符串,然后单击 Bookmark 而不是 Find。然后Edit > Bookmarks > This document,您可以删除或提取到新文件,甚至可以反转书签行,然后继续删除或提取等。

【讨论】:

    【解决方案2】:

    这是不可能的:

    记录为宏的搜索总是硬连线所有参数。

    here on notepad++ community

    【讨论】:

      【解决方案3】:

      很想知道使用 PowerShell(我对此几乎一无所知)可以实现这样的事情,并想出了以下内容。这会覆盖原始文件,我只是给了它一个非常快速的测试,所以显然不要将它与任何没有备份的东西一起使用:)

      PowerShell 脚本 (removelines.ps1):

      # https://stackoverflow.com/a/30534991/957246
      [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
      $title = 'Search'
      $msg   = "The string to search for (lines that do not contain this string will be removed)."
      $text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
      $c = Get-Content $args[0] | where { $_ -match $text }
      $c | Set-Content $args[0]
      

      在 Notepad++ 的“运行”框中保存的命令:

      powershell.exe -ExecutionPolicy Unrestricted -NoLogo -File "<Path to script goes here>\removelines.ps1" "$(FULL_CURRENT_PATH)"
      

      当您运行它时(在当前选项卡上打开/打开要修改的文件),系统会提示您输入搜索字符串。运行后,Notepad++ 将提示重新加载文件 - 现在应该会丢失任何不包含搜索字符串的行。

      【讨论】:

        【解决方案4】:

        我不确定您是否曾经对这个问题得到满意的答案,但从听起来您可以完全在 notepad++ 中使用正则表达式查找和替换来完成此操作。

        例如给定来源:

        Line 1: lorem ipsum
        Line 2: test test test
        Line 3: test IM1 001 test test
        Line 4: IM1 001
        Line 5: nothing here
        Line 6: aaaaaaaaaaaaaaaaaIM1 001aaaaaaaaaa
        Line 7: active
        Line 8: inactive
        Line 9: value
        Line 10: blah blah
        Line 11: …..
        Line 12: …..
        Line 13: this contains the IM1 001
        

        替换: ^(?:(?!IM1 001).)*?$\R*(其中IM1 001 是您要查找的文本/表达式)
        替换为:

        剩下的就是带有您指定的搜索短语的行:

        Line 3: test IM1 001 test test
        Line 4: IM1 001
        Line 6: aaaaaaaaaaaaaaaaaIM1 001aaaaaaaaaa
        Line 13: this contains the IM1 001
        

        如果您想保留空行,只需从表达式末尾删除 \R*

        
        
        Line 3: test IM1 001 test test
        Line 4: IM1 001
        
        Line 6: aaaaaaaaaaaaaaaaaIM1 001aaaaaaaaaa
        
        
        
        
        
        
        Line 13: this contains the IM1 001
        
        
        

        【讨论】:

        • 好吧,这很奇怪。嘿,JonM,在等待正确答案时,我在拼图交换中为您的问题添加了书签,但没有,所以我对答案非常好奇。这是“这个词是什么……”的问题。我试图在聊天中找到你,但没有运气......请通过剧透标签或类似的方式给我答案,以便我可以赎回自己。这个评论是超级垃圾,所以我会在几个小时内删除它。很抱歉给您带来不便
        猜你喜欢
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 2015-07-14
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多