2014-09-05 77 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 

这会做包含foo线bar->blah替代。随着:s我们可以:

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

所以:g更容易。

所以如果你正在处理替代任务,通常应该首先提出:s。如果您想对所有匹配xxx的行执行类似的操作,我想删除/ join/indent/.......:g可能对您有所帮助。