删除 Vim 中除正则表达式匹配之外的所有内容

2024-01-09

我的具体案例是一个包含大量文本和 IPv4 地址的文本文档。我想删除除 IP 地址之外的所有内容。

我可以用:vglobal寻找([0-9]{1,3}\.){3}[0-9]{1,3}并删除所有没有IP地址的行,但之后我只知道如何搜索整行并选择匹配的文本。有更容易的方法吗。

简而言之,我正在寻找一种无需使用外部程序(如 grep)即可执行以下操作的方法:

grep --extended-regexp --only-matching --regexp="([0-9]{1,3}\.){3}[0-9]{1,3}"

从 vim 调用 grep 可能需要调整我的正则表达式(例如:删除 \v)。使用 vim 的增量搜索表明我的模式是正确的,并且我不想在 grep 中验证我的正则表达式。


Edit:感谢彼得,这是我现在使用的功能。 (C 是我通常在函数中破坏的寄存器。)

"" Remove all text except what matches the current search result
"" The opposite of :%s///g (which clears all instances of the current search).
function! ClearAllButMatches()
    let old = @c
    let @c=""
    %s//\=setreg('C', submatch(0), 'l')/g
    %d _
    put c
    0d _
    let @c = old
endfunction

Edit2:我将其设置为接受范围的命令(但默认为整个文件)。

"" Remove all text except what matches the current search result. Will put each
"" match on its own line. This is the opposite of :%s///g (which clears all
"" instances of the current search).
function! s:ClearAllButMatches() range
    let is_whole_file = a:firstline == 1 && a:lastline == line('$')

    let old_c = @c

    let @c=""
    exec a:firstline .','. a:lastline .'sub//\=setreg("C", submatch(0), "l")/g'
    exec a:firstline .','. a:lastline .'delete _'
    put! c

    "" I actually want the above to replace the whole selection with c, but I'll
    "" settle for removing the blank line that's left when deleting the file
    "" contents.
    if is_whole_file
        $delete _
    endif

    let @c = old_c
endfunction
command! -range=% ClearAllButMatches <line1>,<line2>call s:ClearAllButMatches()

这种效果可以通过使用 sub-replace-special 替换和setreg()逐行

:let @a=""
:%s//\=setreg('A', submatch(0), 'l')/g
:%d _
:pu a
:0d _

或全部在一行中:

:let @a=""|%s//\=setreg('A', submatch(0), 'l')/g|%d _|pu a|0d _

概述:使用替换将每个匹配逐行附加到寄存器“a”中,然后用寄存器“a”的内容替换整个缓冲区

解释:

  1. let @a=""清空我们将要附加到的“a”寄存器
  2. %s//\=setreg('A', submatch(0), 'l')/g使用最后一个模式进行全局替换
  3. the \=expr将用表达式的内容替换模式
  4. submatch(0)获取刚刚匹配的整个字符串
  5. setreg('A', submatch(0), 'l')将匹配的字符串附加(注意:大写“a”)到@a,但是逐行
  6. %d _删除黑洞寄存器中的每一行(又名@_)
  7. pu a将@a的内容放入缓冲区
  8. 0d _删除第一行

担忧:

  • 这会毁掉你的一个寄存器。这个例子毁了@a
  • 使用最后的搜索模式。尽管您可以使用您想要的任何模式修改替换命令:%s/<pattern>/\=setreg('A', submatch(0), 'l')/g

如需更多帮助

:h :s\=
:h :let-@
:h submatch()
:h setreg()
:h :d
:h :p
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除 Vim 中除正则表达式匹配之外的所有内容 的相关文章

  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 使用 sed 删除大括号对之间的所有内容

    我有一个看起来像这样的字符串 B F blue master F red f k b f k b K black B F green 我想删除匹配的子字符串 它可能包含也可能不包含相同顺序的其他子字符串 我应该得到 master 作为最终输
  • vim 按语法高亮类型搜索

    我正在将 i18n 添加到现有项目 Web 应用程序 这涉及到用对 i18n 库的调用来替换静态文本的每一位 如果能够搜索该文本 而不是依靠语法突出显示来直观地识别它 将会很方便 在 vim 中 是否可以在文件中搜索特定突出显示类型的出现
  • shell中如何分割字符串

    我有一个变量作为 string ABC400p2q4 我怎样才能分开ABC400 and p2q4 我需要将它分成两个变量 结果我得到 echo var1 ABC400 echo var2 p2q4 可以用任何字母字符代替 ABC 可以用任
  • Perl 非贪婪

    我遇到非贪婪正则表达式 regex 的问题 我已经看到有关于非贪婪正则表达式的问题 但它们没有回答我的问题 Problem 我正在尝试匹配 lol 锚点的 href Note 我知道这可以通过 Perl HTML 解析模块来完成 我的问题是
  • Vim:使用制表符缩进,使用空格对齐

    我已经阅读了几个问题和答案 Vim 使用制表符缩进 使用空格与 C 源文件对齐 https stackoverflow com questions 8493705 vim use tabs for indentation spaces fo
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 使用 php/regex 验证美国电话号码

    EDIT 我混合并修改了下面给出的两个答案 以形成完整的功能 现在它可以完成我想要的功能 然后是一些 所以我想我会将其发布在这里 以防其他人来寻找同样的东西 Function to analyze string against many p
  • 改变 vim 'gutter' 颜色

    请参阅下面我如何配置 vim 的屏幕截图 gutter 即出现 和 符号的位置 使用 vim 的这个令人惊叹的 sublime text 端口显示我的 git 状态 https github com airblade vim gitgutt
  • Java 正则表达式中 \w 和 \b 的 Unicode 等效项?

    许多现代正则表达式实现解释 w字符类简写为 任何字母 数字或连接标点符号 通常 下划线 这样 正则表达式就像 w 匹配像这样的词hello l ve GO 432 or gefr ig 不幸的是 Java 没有 在爪哇 w仅限于 A Za
  • vim中的折叠功能

    有没有什么方法或工具可以在 vim 中折叠功能 例如 Visual Studio 或 Eclipse Vim folding commands zf j creates a fold from the cursor down lines z
  • 请解释*贪婪量词的工作原理

    Pattern ptn Pattern compile a Matcher mtch ptn matcher bbaac if mtch find System out println mtch group 输出 不打印任何内容 Patte
  • 正则表达式将从文本文件中提取句子

    我需要一个正则表达式来从文本文件中提取句子 示例文本 以 2004 年底发生的亚洲海啸灾难为例 对 Google 新闻 http news google com 的查询在一个月内 1 月 17 日 返回了超过 80 000 篇有关该事件的在
  • 有选择地设置 iskeyword

    通常我需要搜索大型 xml 模式文件以查找光标下单词的下一个出现位置 但如果它是一个标签或结束标签 则最好不要搜索 在下面的示例中 是光标所在的位置 使用 or 与 iskeyword 不包括 gt or lt 将在之间移动
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • 局部变量或实例字段名称与正则表达式“[a-z]+”不匹配

    将 Android studio 升级到2 1 2 当我将旧项目导入其中时 我的代码中充满了警告 警告是 Instance field name doesn t match regex a z Local variable name doe
  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • 正则表达式,提取不在两个括号之间的字符串

    好的正则表达式问题 如何提取不在两个字符之间的字符 在本例中是括号 我有一个字符串 例如 字1 字2 字3 字 4 我只想获取第一个和最后一个 管道 而不是括号之间的第二个 管道 我已经尝试了无数次负克拉和负分组的尝试 但似乎无法使其发挥作
  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 与有效正则表达式匹配的正则表达式

    是否存在与有效正则表达式匹配的正则表达式 我知道正则表达式有多种风格 其中一种就可以了 是否存在与有效正则表达式匹配的正则表达式 根据定义 它非常简单 No 所有正则表达式的语言是no regular语言 只需查看嵌套括号 因此不可能有re

随机推荐

  • jQuery scrolltop - 第一次使用后不起作用

    我在此菜单上使用 jQuery 滚动顶部功能 http goethesternfriseure de index php http goethesternfriseure de index php 问题是滚动功能仅在第一次起作用 第二次点击
  • 如何检查 stopCluster (R) 是否工作

    当我尝试使用 stopCluster 从工作区中删除集群时 它似乎不起作用 下面是我正在使用的代码 gt cl lt makeCluster 3 gt cl socket cluster with 3 nodes on host local
  • 在 React 中在函数内声明函数

    我刚刚遇到了一个 React 代码 我不确定这是否是一个好方法 这是该代码的示例实现 class App extends React Component renderMessage gt function getMessage return
  • 程序退出后,使curses程序输出保留在终端回滚历史记录中

    我对诅咒很陌生 所以我正在尝试 python 中的一些不同的东西 我已经初始化了窗口并为窗口对象设置了scrollok 我可以添加字符串 并且滚动可以正常工作 这样 addstr 在窗口末尾不会出现任何错误 我想要的是在程序完成后能够在终端
  • IIS URL 重写 ASP

    我尽力扫描论坛寻求帮助 以制作 web config 来重写此类 url domain com default asp id 3 language 2 我希望这可以是 domain com en service where language
  • Angular2 中的动态模板“嵌入”

    我正在努力实现这样的目标 我有一个名为的模型类ObjectTypeA ObjectTypeB and ObjectTypeC 还有一个工厂ComponentFactory 根据传入的对象类型将创建不同的组件 ComponentFactory
  • 通过代码获取文件 tnsnames.ora 的位置

    我怎样才能获得该位置tnsnames ora在安装了 Oracle 客户端的机器上按代码编写文件 Windows 注册表项是否指示该文件的位置 几年前我也遇到过同样的问题 当时我必须支持 Oracle 9 和 10 因此代码只处理这些版本
  • 访问 R data.frame 中倒数第二个值的最佳方法是什么?

    假设我有一个名为 SLV 的 data frame 并且我应用了 tail 函数 我会得到这个 gt tail SLV SLV Open SLV High SLV Low SLV Close SLV Volume SLV Adjusted
  • 致命错误:脚本超出最大执行时间 30 秒

    我有一位客户收到与脚本超时相关的错误 我已经包含了下面的代码 但我认为问题是需要延长超时 这是我可以在代码中设置的内容 还是必须由网络托管服务商 GoDaddy 设置 致命错误 D hosting 123 html siteame wp c
  • mysql 仅当用户不存在时创建用户

    我想执行一个CREATE USER语句 但仅当用户尚不存在时 这样做的最好方法是什么 如果您要创建用户 则还需要创建授权 如果用户不存在 授权会隐式创建一个用户 这就是为什么我们鼓励您在创建授权时包含密码 以防万一它们不存在 看http d
  • EF Core:使用字典属性

    有没有办法用 Entity Framework Core 填充字典属性 出于性能原因 我们喜欢在应用程序而不是数据库中进行搜索 由于列表不能很好地扩展 我们喜欢使用字典 例如 简化示例 class Course public Diction
  • console.log 的替代品?

    我想知道是否有其他方法可以在不使用控制台消息的情况下向控制台写入内容 我的项目在完成构建之前删除了所有控制台语句 但在特殊情况下 我需要找到一种通过控制台向用户显示某些内容的方法 如果没有控制台语句 这是否可能 您只能通过 Console
  • Scala 递归理解只在空列表前面添加一次,为什么?

    类似于这篇文章here https stackoverflow com questions 41471322 for comprehension in scala with recursive call 我正在学习 Scala 函数式编程
  • 如何在struts 2的s:action标签中使用ignoreContextParams属性

    在Struts 2中 有一个
  • 在 python 中连接 .m3u8 中存在的文件

    我正在尝试在 python 中连接 m3u8 播放列表中存在的 ts 文件 有什么办法可以做到吗 如果是 请解释一下如何 提前致谢 这应该可行 我只在这个简短的脚本中添加了两条注释 因为我想它几乎是不言自明的 import shutil P
  • 如何在discord.py中使用on_raw_reaction_add?

    好吧 我有一个程序 一个票务系统 它以 JSON 格式记录工单创建消息 ID 以便在程序重新启动时可以继续检查是否添加了新的反应 但我发现该消息必须加载到机器人的缓存中 但一旦重新启动 它就不会存在 所以我发现on raw reaction
  • 强制转换规范的字符值无效

    我正在使用 SQLXMLBulkLoad SQLXMLBulkload 3 0 将数据插入 SQL 2005 我的数据表有以下列 objDataTable Columns Add TaskDateTime System Type GetTy
  • Objective-C:UIViewController 中出现的键盘隐藏的 UIScroller 和 UItextfields

    我需要帮助尝试在 UIViewController 中配置键盘 a 不要将鼠标悬停在两个 UITextfields 上 因此滚动条应该正确定位 b 当用户触摸背景时键盘消失 我还没有尝试过 b 但我正在尝试 a 并且我通过谷歌搜索得到的代码
  • [System.Collections.Generic.List[string]] 作为返回值

    我需要 想要退货 System Collections Generic List string 来自函数 但它正在转换为System Object 我有这个 function TestReturn returnList New Object
  • 删除 Vim 中除正则表达式匹配之外的所有内容

    我的具体案例是一个包含大量文本和 IPv4 地址的文本文档 我想删除除 IP 地址之外的所有内容 我可以用 vglobal寻找 0 9 1 3 3 0 9 1 3 并删除所有没有IP地址的行 但之后我只知道如何搜索整行并选择匹配的文本 有更