VI删除除模式之外的所有内容

时间:2016-01-06 15:40:55

标签: regex vim pattern-matching vi

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

字符串的格式为

:%s/\("title":\s"*"\)

" someServerName" (引号内的部分)可能会有很大差异。

我最接近的是:

"title": "

但这只是设法删除

"title": "someServerName"

每行我唯一想要的就是

{"_links": {"self": {"href": "/api/v2/servers/32", "title": "someServerName"},tons_of_other_json_crap_goes_here

编辑回答发布的问题:

我正在使用的文字将具有类似于

的格式
"title": "someServerName"

我想留下的所有内容是:

{{1}}

5 个答案:

答案 0 :(得分:5)

匹配一组任何字符应该是.*而不是*。这样做了:

%s/^.*\("title":\s".*"\).*$/\1/

各部分的说明:

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

答案 1 :(得分:1)

这听起来像是grep的工作。

:%!grep -o '"title":\s*"[^"]*"'

有关Vim过滤的更多帮助,请参阅:h :range!

有关man grep / -o标志的详情,请参阅--only-matching

答案 2 :(得分:0)

 %s/\v.*("title":\s".*").*/\1

解释和来源here

答案 3 :(得分:0)

如果将replace命令分为以下两个步骤,它就会很方便。 (p.s.我最近从好的指导书“Practical Vim”中学到了这个技能。)

第1步:搜索您要保留的内容

  • \v"title":\s.*"
    这将匹配" title":" someServerName"。您可以使用命令q/一次又一次地尝试打开搜索命令窗口并修改正则表达式(这是我认为最优秀的部分)。
  • \v^.*("title":\s.*").*$
    然后添加括号供以后使用,并添加。*以匹配您要删除的其他部分。

第2步:替换匹配的内容

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

希望你能比长期模糊的替代命令更方便。

答案 4 :(得分:0)

我认为解决这个问题的最优雅的方法是使用':g' 在下面的此链接中有更全面的详细信息! Power fo G

它可能不会完全存档您正在寻找的内容,但是该死的;)