2016-01-06 148 views
2

我有一個巨大的JSON輸出,我只需要刪除除了每行中的小字符串以外的所有內容。VI刪除除模式以外的所有內容

該字符串的格式

"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" 
+1

你可以發佈你的輸入是什麼,你的預期輸出是什麼?你的帖子中的內容還不太清楚 – edi9999

回答

5

應該.*而非*來匹配任何字符組。這樣做的工作:

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

說明各部分的:在每個匹配行

  • %s/替代品。
  • ^.*忽略從行首開始的任何字符。
  • \("title":\s".*"\)捕獲標題和服務器名稱。 ".*"將匹配引號之間的任何字符。
  • .*$忽略該行的其餘部分。
  • /\1/替換的結果將成爲第一個被捕獲的組。小組被\(...\)括號捕獲。
+0

你能否提供一下每個部分的含義?我想我知道他們中的很多人,但經常有人以不同的方式解釋他們。我還想看看我是否可以嘗試改變這種方式,以便在文件 –

+0

中存在該模式的多個實例時保留「標題」的所有實例:「someServerName」。好吧,我添加了一個分解。該命令處理多個匹配行。 –

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

說明和源here

0

這聽起來像是一份工作grep

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

有關Vim過濾的更多幫助,請參閱:h :range!

有關-o/--only-matching標誌的更多信息,請參見man grep

0

如果您將替換命令分爲兩步,如下所示,退出方便。 (我最近從好的指導書「Practical Vim」中學到了這個技巧)。

1步:搜索你想保持

  • \v"title":\s.*"
    這將匹配 「稱號」 的內容: 「someServerName」。您可以使用命令q/一次又一次嘗試打開搜索命令窗口並修改正則表達式(這是我認爲的最優秀的部分)。
  • \v^.*("title":\s.*").*$
    然後爲後面的使用添加括號並添加。*以匹配您想要刪除的其他部分。

第2步:更換匹配的內容

  • :%s//\1/g注意這個命令代替原來的字符串是在上次搜索匹配的部分(在vim非常好的功能)。而\1意味着使用匹配的組,它實際上是您希望保留的部分。

希望你能找到比長的隱蔽的替代命令更方便。

相關問題