VIM替换 压箱底的技巧
VIM是在Linux下使用最广泛的的文本编辑器,尤其是文本查找和替换命令,结合了正则表达式,非常强大。
本文列举了我经常使用的一些替换方法,仅供参考。
单词替换
%s/four/4/g
↑ ↑
| +-- 替换行中所有的匹配项目
在所有行中执行替换
替换结果:
four --> 4
thirtyfour --> thirty4
< 指定匹配单词的开始
> 指定匹配单词的结尾
:%s/\<four\>/4/gc //只替换 four ↑ 在每次替换前提示确认
正则表达式:将 Last, First 改成 First, Last, 如何做呢?
- 原文: Doe, John Smith Peter
- 改成: John Doe Peter Smith
替换命令
%s/\([^,]*\),\(.*\)/\2 \1/
对命令的解释:
%s from/to //正斜杠区分 from 和 to 部分
from部分
`\([^,]*\),\(.*\)`
具体解释:
\( \)
: 匹配”Last”部分[^,]
: 匹配除了逗号(,)之外的任何东西*
: 任意多次,
: 匹配逗号(,)\( \)
: 匹配”First”部分.
: 匹配任意字符,
: 任意多次
to部分
\2 \1
其中,“\2”与“\1”称为反向引用,反向引用就是指前面from部分中 \(
和 \)
之间的部分。
具体解释:
\2
: 指代第二对\(
和\)
之间的部分,也就是 First部分\1
: 指代第一对\(
和\)
之间的部分,也就是 Last部分
在替换时,最多可以使用9个反向引用。\0
表示整个匹配的部分。
常用替换技巧
删除多余的空格
%s/\s\+$//
其中 \s\+$
表示匹配 行末($
) 前面的 一个或者多个(\+
) 空格(\s
)
使用宏在多个文件中替换
例如,有一个包含C++代码的文件夹,所有文件都以 “*.cpp” 结尾,有一个名为 “GetResp” 的函数,现在要把它的名字改为 “GetAnswer”。
具体步骤如下:
vim *.cpp
vim启动后会待在第一个文件上,此时执行下面的命令:
qq
意思是用q作为寄存器启动一次记录,也可以使用qa~qz。
接着执行下面的命令:
:%s/\<GetResp\>/GetAnswer/g
意思是在第一个文件中替换并执行,接着执行下面的命令:
:wnext
意思是保存文件,并转到下一个文件。接着执行下面的命令:
q
意思是终止记录,然后执行下面的命令:
@q
意思是回放寄存器q中的操作过程,这回执行又一次的替换和 :wnext
命令,这时可以看看录制的宏有没有出问题。
没有问题的话,接着执行下面的命令:
999@q
意思是对于剩下的文件执行寄存器q中录制的命令,执行999遍(999好像 @q
的最大值)。
此时会有一个问题,任何错误都会终止回放过程,如果有一个文件不包含 “GetResp”,VIM会报错,而且整个替换过程也会终止。为了避免此问题,改用下面的替换命令重新录制一下宏:
:%s/\<GetResp\>/GetAnswer/ge
其中,e 是标记通知,表示命令找不到的话,不算是错误。
单词统计
统计整个文件的单词可以使用下面的命令:
gCtrl + g
统计选项部分的单词,可以进入可视模式,选中区域,然后执行 gCtrl+g
。
删除Windows文本文件中的 “^M” 标记
使用下面的命令即可:
:%s/\r//g
或者
:%s/[Ctrl+v][Enter]//g
上面的 [Ctrl+v][Enter]
意思是 使用组合键 Ctrl+v之后,按下回车。
(END)