Regex VI删除除图案以外的所有内容
我有一个巨大的JSON输出,我只需要删除每行中的所有内容,除了一个小字符串 字符串的格式为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":
"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*"[^"]*"'