2020年3月5日 星期四

vi替换字符串命令s

当使用vi时,既可以使用vi(面向屏幕)命令,也可以选用较古老的ex(面向行)命令。到目前为止,我们讨论的大多数命令都是vi命令。下面我们将讨论ex命令。

所有的ex命令都以一个:(冒号)字符开头。每当在命令的开头键入一个冒号时,vi将在命令行(屏幕的底部)立即显示它。在键入命令的其它部分时,命令将回显在这一行上(这就是称这一行为命令行的原因) 。可以看出,ex命令要比vi命令长,而且更复杂。基于这一原因,在,在键入命令的过程中,vi将回显命令,从而使你看到自己正在做什么。vi命令中仅有的复杂长命令就是搜索命令(/和?),也由于这一原因,这两个命令也在命令行上显示。

为了替换一个特定的命令,可以使用ex命令:s(substitute,替换)。其语法为:
:s/pattern/replace/

其中pattern是希望替换的模式,replace是替换文本。例如,为了当前行上的 “UNIX”替换为“Linux”,可以使用:

:s/UNIX/Linux
以这种方式使用:s只替换当前行上该模式的第一个匹配项。为了替换所有的匹配项,需要在该命令的末尾键入字母g(global,全局)。例如,为了将当前行上所有的“UNIX”都替换为“Linux”,可以使用:

:s/UNIX/Linux/g
如果希望vi在进行改变之前先经过您的同意,则需要在该命令的末尾添加字母c(confrim,确认):
:s/UNIX/Linux/c
当然,也可以将gc组合在一起使用:

:s/UNIX/Linux/cg
当使用c修饰符时,vi将显示包含该模式的行。vi指出模式的位置,然后等待确认。如果希望进行替换,可以输入y(代表yes),然后再按<Return>键本身(如果不指定 “y”或者“n”,那么vi将慎重的假定您不需要修改)。

为了删除模式,只需要将该模式替换为空即可。例如,为了一处当前行所有的“UNIX”,可以使用:

:s/UNIX/ /g
为了方便起见,如果不再命令的末尾使用一个c或者g,则可以省略最后的/字符。例如,下述两条命令是等价的:

:s/UNIX/Linux/
:s/UNIX/Linux
:s命令有两个重要的变体。首先,可以在冒号后面指定一个特定的行号。这将告诉vi在特定行上执行替换。例如,为了将第57行上第一次出现的 “UNIX”改变为“Linux”,可以使用:

:57s/UNIX/Linux/
(提醒:使用set number可以显示行号;使用set nonumber可以隐藏行号。)

除了单独的行号外,还可以使用两个用逗号分隔的行号表示一个范围。例如,为了在第57行至第第60行之间进行相同的替换,可以使用:

:57, 60s/ UNIX/Linux/
在这个歌例子中,vi将替换该范围之内每行上指定模式的第一个匹配项。

大多数时候,您不会使用具体的行号。但是,有3种特殊的符号使这种形式的命令特别有用。.(点号)代表当前行,$(美元符号)代表编辑缓冲区的最后一行。因此,下述命令将当前行至编辑缓冲区末尾所有“UNIX”都替换为“Linux”:

:.,$s/UNIX/Linux/g
为了从编辑缓冲区的开头到当前行进行相同的改变,可以使用:

:1,.s/UNIX/Linux/g
第三个特殊符号是%(百分比符号),它代表编辑缓冲区的所有行。因此,为了将编辑缓冲区的每一个“UNIX”都改变为“Linux”,可以使用:

:%s/UNIX/Linux/g
这与从第一行到第$行(编辑缓冲区的末尾)进行替换的效果相同:

:1,$/UNIX/Linux/g
使用%要比使用1$方便许多,因此一定要记住这个方便的缩写,今后您会大量的使用它。

有时候,可能希望vi确认每个替换。这样可以控制替换模式的那些实例。正如前面所讨论的,只需使用c(confirm,确认)修饰符即可,例如:

:%s/UNIX/Linux/g
当使用这些命令时,可以通过^C(inter 键)在半途停止。这将终止这条命令,而不仅仅是当前替换。

处于参考目的,下面汇总了:s命令的使用方法:

:s/pattern/replace/ 替换当前行

:lines/pattern/replace/替换指定行

:line,lines/pattern/replace 替换指定范围行

:%s/pattern/replace 替换所有行

在命令的末尾,可以使用s告诉vi在替换之前要求确认,而使用g(global,全局)则表示替换每行上的所有匹配项。为了指定行号,可以所有实际数字,也可以使用.(点号)表示当前行,或者使用$(美元符号)表示编辑缓冲区的最后一行。数字1表示编辑缓冲区的第一行。

沒有留言:

張貼留言