2014-09-05 437 views
14

今天我開始使用vim。我對:g:%s命令感到困惑。那麼,:g:%s命令有什麼區別?有什麼區別:g和:%s命令在vim中

+0

':%s'是應用於整個文檔的替代命令,不是作爲':g'的全局公共前綴。 – 2014-09-05 11:16:13

+1

@ Jean-KarimBockstael我認爲你將':g [lobal]'命令與選項和變量的'g:[name]'前綴相混淆。 – 2014-09-05 11:35:52

+0

如果您今天開始使用vim,我強烈建議您使用vim-tutor。你可以用':help tutor'直接在vim中找到關於它的信息。 – mMontu 2014-09-05 12:55:56

回答

23

:g上匹配正則表達式的所有行執行命令:

:g/LinesThatMatchThisRegex/ExecuteThisCommand 

實施例:

:g/hello/d 

這將刪除(d)包含你好所有行。

在另一方面,:%s只是執行搜索(在正則表達式),本文件替換:

:%s/hello/world/g 

(該g也意味着全球化,所以它會取代所有的人,而不僅僅是一個每行,如果要手動確認每個替換項,也可以使用c標誌(:%s/hello/world/gc)。

這將替換所有出現的helloworld

:g:%s命令都支持正則表達式。

s命令意味着substitute%意味着整個緩衝區。所以%s意味着整個緩衝區的替代。您也可以輸入一行範圍:

:10,15s/hello/world/g 

這將執行前面僅在第10行至第15行(含)的搜索和替換。

+1

':g'只能在當前緩衝區中執行,與':s'相同。它們唯一的區別在於默認的範圍:':s'和':.s'相同,':g'是':%g'。因此':%s/pat/subs'和':%g/pat/cmd'(或':g/...')將作用於緩衝區中與pat匹配的所有行,而':.s /如果匹配pat,pat/subs'(或':s/...')和':.g/pat/cmd'將在當前行上起作用。 – mMontu 2014-09-05 12:45:32

6

它們是不同的。

:g可以執行命令匹配的行。 :s是這些命令之一。也就是說,你可以結合:g and s

:%s只是搜索和替換整個緩衝區,即使它可以做一些其他的事情表達過,但它並不像:g那麼簡單。

例如爲:

:g/foo/s/bar/blah/g 

這會做包含foobar->blah替代。隨着:s我們可以:

:%s/foo/\=substitute(getline('.'), 'bar','blah','g') 

所以:g更容易。

所以如果你正在處理替代任務,通常應該首先提出:s。如果您想對所有匹配xxx的行執行類似的操作,我想刪除/ join/indent/.......:g可能對您有所幫助。

相關問題