学习vi和vim编辑器(8):全局替换(1)

本章学习vi编辑器中的全局替换命令。通过全局替换命令,可以自动替换文件中所有出现过的某个单词。全局替换一般会用到两个ex命令:":g"(global),":s"(substitute)。

替换命令:

替换命令的语法如下: " :s/old/new/ ",该命令会将当前这一行中第一个出现的old模式替换为new。其中斜线用来分隔命令的各部分(如果斜线位于该命令的最后一个字符,则该斜线可以省略)。

" :s/old/new/g "会将当前这一行中的所有old模式替换为new。在s前面加上行地址,就可以指定替换命令将会影响的行范围。例如 : " %s/old/new/g "就能将文件中所有的old模式替换为new,如下图所示:该命令将文件中的所有line替换为file。

而以下命令只会将文件所有行中的第一个line替换为file:

确认替换:

在使用搜索和替换命令时,应该非常小心。可以在替换命令的结尾加上c选项(代表confirm),从而在每一次替换之前进行确认,如下图所示:

此时输入y(代表"yes")即可对当前匹配的到的字符串进行替换,而输入n则不进行替换。

与上下文有关的替换:

有时,需要搜索一个模式,当找到包含该模式的某个行时,将该行中的另一个字符串进行替换。即搜索模式并不是需要被替换的字符串。此时可以通过如下命令实现 " :g/pattern/s/old/new/g "。其中第一个g代表对文件中的所有行起作用,而最后一个g代表将每行中的所有old都替换为new(如果没有这个g,则只会对每一行中的第一个old进行替换),patten即为搜索模式。

如下图所示:该命令将搜索所有包含" Line "模式的行,并将该行中的 "this "字符串替换为" that "。

当用于搜索的模式和用于替换的模式一样时,就没有必要重复输入了。此时可以简写为 " :g/string/s//new/g ",该命令和 ":%s/string/new/g"命令效果一样。

模式匹配的规则:

除了可以搜索常量字符串,vi编辑器还可以搜索可变的模式,即正则表达式。正则表达式是一种将普通字符和特殊的元字符结合起来的表达式。

用在搜索模式中的元字符:

. (点号):匹配任何一个单一字符(除换行符外);

* :匹配0到无穷多个前一个字符,因此  .* 即可匹配出任何数量的任何字符;

^:当^出现在正则表达式的开头时,代表后面的正则表达式内容必须出现在一行的开头。如果^不是出现在正则表达式的开头,则没有特殊含义;

$:当$出现在正则表达式的结尾时,代表前面的正则表达式内容必须出现在一行的结尾。如果$不是出现在正则表达式的结尾时,则没有特殊含义;

\ : 相当于转义字符,将后面的特殊字符当成一般的字符。

[ ]:匹配出方括号里的任何一个字符。例如p[aeu]t 匹配中pat,pet,put。而且如果匹配目标为一个范围的字符,则可用第一个字符加上连字符,再加上最后一个字符来表示。例如,[A-Z] 匹配出A到Z之间的大写字母,[0-9]匹配出0到9内的任何数字。而且方括号内可以包含两个以上的范围,也可以混合使用范围和单个字符。插入符号^作为方括号内的第一个字符时,表示匹配出任何一个不在方括号中字符范围内的字符。

\(\):会将 \( 与 \) 之间的模式保存到特殊的空间(称为保留缓冲区)。这种方法可以保存任何一行中的9个模式。

\< \>  会匹配出以某些字符开头(\<)或结尾(\>)的单词;

~:会匹配出上一次搜索时所使用的正则表达式。

POSIX方括号表达式:

方括号除了可以用于匹配出位于方括号内的任何一个字符,POSIX引进了另外的方法,用于比较非英文字母的字符。在POSIX标准中,方括号内的字符组称为“方括号表达式”。方括号表达式中,除了可以有文字字符,还可以包括其它元素:

字符类:POSIX字符类包括了用 [: 与 :] 括起来的关键字。

校对符号:校对符号是由多个字符组成的序列,但是必须被当成一个单位。并且使用 [. 与 .]括起所需字符。

等价类:等价类列出所有应该被当成相等的字符集合,用[=与=]括起来。

这三类都必须出现在方括号表达式中,例如 [[:alpha:]!] 匹配出任何一个字母字符或者感叹号。具体的POSIX字符类型可以参看《vi和vim编辑器》第六章:全局替换。

用在替换字符串中的元字符:

当做全局替换时,前面提到的具有特殊意义的元字符只能用在命令的搜索部分,即第一部分。而在替换字符串部分,这些元字符可能就失去了特殊意义。例如下图中的命令只会将A或B或C都替换为"[abc]",而不是相应的小写字母。

但是在替换字符串中,仍然存在一些具有特殊意义的元字符。

\n:利用 \( 与 \) 存储的第n个模式做文本替换;

\:和搜索模式中的 \ 字符含义相同,都是转义字符,使后面的一个特殊字符变为普通字符,从而失去特殊含义;

&:当用在替换字符中,&会被替换为搜索模式匹配出的完整文本,这在避免重复输入文本时很有用;

~:和搜索模式中的~元字符意义类似,用来代表最后一个替换命令中的替换文本。这在重复编辑时很有用;

\u或\l:使替换字符串中的下一个字符变成大写或小写;

\U或\L或\e或\E:\U或\L会使后面的所有字符都被转化成大写或小写的,直到出现\e或\E为止。

更多替换技巧:

:s:等同于 :s//~/,即会重复上一次替换;

:& : 也能重复上一个替换,可以把&想象成" 同样的东西 ";

:~ :与:&命令类似,但是用来搜索的模式是上一个出现的正则表达式,而不是上一个替换命令中使用的正则表达式。

除了使用 / 字符作为替换命令中的分隔符,还可以使用任何非字母,非数值,非空格的字符,但是反斜线,双引号,和竖线除外,这在对路径字符串做替换时非常有用。

本章vi命令总结:

:s/old/new,g选项,c选项,:g,

搜索模式中的特殊字符  ., *, ^, $, [], \(\), \<, \>, ~,

替换模式中的特殊字符 \n,\, &,~, \u, \l,\U,\L, \e,\E,

:s, :&, :~。

时间: 2024-08-27 13:38:23

学习vi和vim编辑器(8):全局替换(1)的相关文章

学习vi和vim编辑器(9):全局替换(2)

上一篇文章已经学习了如何通过vi编辑器中" :s "命令进行全局替换,而且可以在替换命令中使用正则表达式以进行强大的模式匹配.这一篇文章将学习模式匹配的更多范例,以进一步熟悉正则表达式. 模式匹配的范例: (1)匹配一个完整的单词:如下图所示,如果需要将文本里所有的child单词替换成为children,可能最先想到的就是下图所示的替换命令: 但是这个命令会把childrendish,Fabrichild这两个单词中的child都做替换,这不是我们想要的.替换的关键就是child要是一

学习vi和vim编辑器(16):vim的多窗口功能(1)

vim默认是在一个窗口中编辑所有文件,在文件间移动或者移动到文件的不同部分时只显示一个缓冲区.但vim也提供了多窗口编辑功能,可以简化复合的编辑任务.这篇文章将学习如何在一个运行的vim进程里使用多窗口,包括多窗口编辑工作的初始化与启动,在窗口间移动光标,在显示区中移动窗口等. 启动多窗口编辑: 可以在打开vim时启动多窗口编辑,也可以在编辑会话中分割窗口. 从命令行(shell)启动多窗口: 默认情况下,vim为一个会话只打开一个窗口,即使打开时已经指定多个文件.如果想从命令行中打开多个窗口,

学习vi和vim编辑器(15):vim对vi的主要改进

vim对vi做了大量改进,本章将讨论在vim中添加的主要功能:包括内置帮助功能.启动与初始化选项.新的移动命令.扩展的正则表达式.扩展的撤销.自定义可执行文件等. 内置帮助功能: vim的说明文档超过10万行,几乎所有的说明都可以通过vim内置的帮助工具取得,使用它最简单的形式就是调用" :help "命令.使用内置的帮助功能需要了解vi的导航技巧,知道如何在标签间前进与后退.当光标处于某个标签上时,按下" CTRL+] "前往该标签,按下" CTRL+T

学习vi和vim编辑器(13):vi同类品的功能总览

本章将学习vi同类品提供的相关功能. 它们都是我兄弟: 有许多可以自由取得的vi编辑器同类品.<vi和vim编辑器>重点介绍了vim编辑器,也简要地介绍了另外三种常用的同类品:nvi,elvis,vile.这些同类品都提供了vi之外的许多扩展功能,尽管方式可能不同,但这些同类品通常会提供相同的扩展功能.本篇文章将总体介绍这些同类品提供的扩展功能. 多窗口编辑:可以将屏幕分割成多个"窗口",从而在每个窗口编辑不同的文件,或者观察同一文件的不同部分.这使得同时在多个文件中工作更

学习vi和vim编辑器(11):高级编辑方法(2)

本章学习在vi编辑器中如何保存命令. 保存命令: vi和ex中提供了许多方法来保存一长串命令序列,这样当调用已保存的序列时,只需要输入几个字符即可. 单词缩写: 可以定义缩写,让vi在处于插入模式时替你自动将输入展开成原文.定义缩写的命令为:"  ab abbr phrase ",其中abbr就是给phrase指定的缩写.注意,在插入模式中,只有将缩写当成单个单词输入时,缩写才会被展开,单词内的abbr不会被展开.如下图所示,将"vi"定义为"visual

学习vi和vim编辑器(17):vim的多窗口功能(2)

接着上一篇文章,继续学习vim编辑器的多窗口功能.本篇文章主要学习调整窗口尺寸.缓冲区及其与窗口的交互.分页编辑.关闭与离开窗口. 调整窗口尺寸: 在gvim中,可以使用鼠标调整窗口尺寸,只需要用鼠标点击及拖动窗口边界即可.如果是在vim中,只要开启mouse选型(" :set mouse=a "),也能够用鼠标调整窗口尺寸. 窗口尺寸调整命令: ^W=:试图调整所有窗口至相同尺寸(此命令受当前的winwidth和winheight选项值的影响).如果可用的屏幕块不能平均划分,vim也

学习vi和vim编辑器(1):vi文本编辑器

UNIX系统中有很多编辑器,可以分为两种类型:行编辑器和全屏编辑器.行编辑器每次只能在屏幕中显示文件的一行,如ed和ex编辑器,全屏编辑器可以在屏幕上显示文件的一部分. vi(读为vee-eye)编辑器是UNIX_Like操作系统的标准文本编辑器.vi是 visual editor的缩写,vi编辑器属于全屏编辑器,可以在阅读文件时当场就修改,并且立刻看到修改后的结果.对于新手而言,vi编辑器难度还是非常大的,但是一旦熟悉了vi编辑器,可能就再也不想重新使用其他"简单"的编辑器了.学习v

学习vi和vim编辑器(12):高级编辑方法(3)

本章主要学习vi编辑器中的@功能,ex脚本以及ctags工具的使用. @功能: 命名缓冲区提供了另一种方法来创建"宏",即可以将复杂的命令序列保存到某个命名缓冲区中,再通过@命令执行缓冲区中的内容.举个例子,首先在插入模式中输入如下一行: 然后将该行内容删除并将其保存到" a "这个命名缓冲区中,之后便可以将光标移动到某个单词的首部,执行" @a ",就可以将缓冲区中的内容作为命令进行执行.在这个例子中就是将该单词修改为function,同时仍然

学习vi和vim编辑器(10):高级编辑方法(1)

从本章开始将介绍一些vi和ex编辑器的高级功能.这一篇文章主要介绍如何自定义编辑环境,如何在vi中执行UNIX命令以及如何通过UNIX命令在vi中过滤文本. 自定义vi: vi编辑器中有许多可以设置的选项,这些选项将影响vi编辑器的运作. 可以使用ex命令 " :set "在vi中改变选项.而且,只要vi被打开,就会读取位于你的主目录的" .exrc "文件,以取得vi的相关设置.在这个文件中使用" :set "命令,就可以改变vi的运作方式.除