共计 1149 个字符,预计需要花费 3 分钟才能阅读完成。
本文约定:$ + 命令 表示在普通的 bash 的命令行下: + 命令 表示在 vim 的 ex(命令)模式,按 ”Ctrl” + “:” 进入
替换命令的基本语法
在全局替换中,ex 编辑器使用指定的字符模式对文件中的每行进行检查。在所有行中发现模式的位置,ex 使用新字符串来替换模式。
全局替换真正使用的是两个 ex 命令是:g(global 全局)和:s(switch 替换)。
替换命令的语法如下:
:s / old / new / 这将把当前中模式 old 的第一次出现修改为 new。/(斜杆)是命令不同部分之间的分隔符(当斜杆为该行的最后一个字符时,可不写)
下面这种形式的替换命令::s / old / new / g 把当前行 old 的每次出现改为 new,而不只是该行的第一个 old。:s 命令允许替换串后面带有选项,上面语法中的 g 代表全局(g 选项影响一行中的每个模式,不要把它与影响文件中所有行的:g 命令混淆)
通过在:s 命令前加上地址前缀,可以把它的范围扩展到多行。例如下面命令把 50 行到 100 行的 old 的每次出现都改为 new::50, 100 s / old / new / g
下面的命令把整个文件中的 old 的每次出现都改为 new::1, $s / old / new / g 我们知道 % 等价于 1,$,所以上行命令也可以这样写::% s / old / new / g
确认替换
使用搜索替换命令有时候会出错,而得到不想要的结果。所以小心并确认文件中需要修改的内容是一个明智的做法
在替换命令尾部加上 c (confirm 用于确认),在替换每个 old 前都会提示并确认::1, 30 s /old/new/ gc 将会出现提示 replace with hehe (y/n/a/q/l/^E/^Y)? y 替换,n 不替换,a 替换所有,q 放弃,l 替换第一个并进入插入模式,^E 和 ^Y 是提示你用 Ctrl+ e 或 Ctrl+ y 来滚动屏幕的。
上下文相关替换
除了直接使用一个单词(或短语)替换另一个,还有稍微复杂的全局替换语法。这些语法可以对一个模式进行搜索,一旦找到含有模式的行,就可以使用不同与模式的串进行替换,我们把这种替换叫做上下文相关替换。
语法格式如下::g /pattern/s/old/new/g 将会把包含 pattern 的行中,把所有 old 替换为 new 第一个 g 表示是在文件的所有行上执行的命令,模式 pattern 识别要发生替换的行。在那些包含模式 pattern 的行上,ex 将把 old 替换(s)为 new。最后的 g 表示在该行上进行全部替换。
如果用来进行搜索的模式与想要修改的模式相同,那么就不必重复它::g/string/s//new/g 等价于:g/string/s/string/new/ g 还要注意::g/string/s//new/g 也等价于:% s/string/new/ g 可以用第二种方式少输一些字符