我有一个巨大的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}}
答案 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.*"
q/
一次又一次地尝试打开搜索命令窗口并修改正则表达式(这是我认为最优秀的部分)。\v^.*("title":\s.*").*$
第2步:替换匹配的内容
:%s//\1/g
请注意,此替换命令中的原始字符串是上次搜索中的匹配部分(vim中的非常好的功能)。而\1
表示使用匹配的组,这实际上是您希望保留的部分。希望你能比长期模糊的替代命令更方便。
答案 4 :(得分:0)
我认为解决这个问题的最优雅的方法是使用':g' 在下面的此链接中有更全面的详细信息! Power fo G
它可能不会完全存档您正在寻找的内容,但是该死的;)