Regex VI删除除图案以外的所有内容

Regex VI删除除图案以外的所有内容,regex,vim,pattern-matching,vi,Regex,Vim,Pattern Matching,Vi,我有一个巨大的JSON输出,我只需要删除每行中的所有内容,除了一个小字符串 字符串的格式为 "title": "someServerName" “someServerName”(引号内的部分)可能变化很大 最接近我的是: :%s/\("title":\s"*"\) 但这只是设法删除 "title": " 在每一行中我只想留下一件事 "title": "someServerName" 编辑以回答发布的问题: 我将要处理的文本的格式与 {"_links": {"self": {"href":

我有一个巨大的JSON输出,我只需要删除每行中的所有内容,除了一个小字符串

字符串的格式为

"title": "someServerName"
“someServerName”(引号内的部分)可能变化很大

最接近我的是:

:%s/\("title":\s"*"\)
但这只是设法删除

"title": "
在每一行中我只想留下一件事

"title": "someServerName"
编辑以回答发布的问题:

我将要处理的文本的格式与

{"_links": {"self": {"href": "/api/v2/servers/32", "title": "someServerName"},tons_of_other_json_crap_goes_here
最后我只想说:

"title": "someServerName"

它应该是
*
而不是
*
来匹配任何字符组。这就是工作:

%s/^.*\("title":\s".*"\).*$/\1/
各部分说明:

  • %s/
    在每个匹配行上替换
  • ^.*
    忽略从行首开始的任何字符
  • \(“标题”:\s“*”\)
    捕获标题和服务器名称<代码>“*”将匹配引号之间的任何字符
  • *$
    忽略该行的其余部分
  • /\1/
    替换的结果将是第一个捕获的组。该组由括号
    \(…\)
    捕获

解释和来源。

这听起来像是
grep的工作

:%!grep -o '"title":\s*"[^"]*"'
有关Vim过滤的更多帮助,请参阅
:h:range


有关
-o
/
-仅匹配
标志的更多信息,请参见
man grep

如果将replace命令分为以下两个步骤,则退出非常方便。(另外,我最近从一本很好的指南书《实用Vim》中学到了这项技能)

步骤1:搜索要保留的内容

  • \v“title”:\s.*“

    这将匹配“title”:“someServerName”。您可以使用命令
    q/
    反复尝试,以打开搜索命令窗口并修改正则表达式(我认为这是最优秀的部分)
  • \v^.*(“标题”:\s.*).*$

    然后添加括号供后面使用,并添加。*以匹配您希望删除的其他部分
步骤2:替换匹配的内容

  • :%s/\1/g
    注意,此替换命令中的原始字符串是上次搜索中匹配的部分(vim中非常好的功能)。而
    \1
    意味着使用匹配的组,这实际上是您希望保留的部分

希望您能发现它比冗长而晦涩的替换命令更方便。

我认为解决这个问题最优雅的方法是使用“:g” 更全面的细节在下面的链接中!


它可能无法完全归档您正在查找的内容,但非常接近;)

你能发布你的输入和预期输出吗?您的邮件中不清楚,请您提供这些部分的详细信息,好吗?我想我知道很多,但很多时候人们对它们的解释是不同的。我还想看看是否可以尝试更改它,以保留“title”的每个实例:“someServerName”如果文件中有多个该模式的实例,我添加了一个细分。该命令确实处理多个匹配行。请记住,这是一个非常古老的帖子。并尝试发布具体答案,例如使用:g/模式/d
:%!grep -o '"title":\s*"[^"]*"'