既然已经选择了VIM,那么当然要在文本处理效率上走向极致, 本篇主要记录一下vim中常用的正则表达式操作, 来进一步提高自己的效率。
Quick Index
1 | 删除行尾空格: %s/\s\+$// |
基本操作
1 | :[line num1, line num2]s/str1/str2/flag # 匹配num1-num2的行 |
也可以先用visual (v) 来选择一段文本再使用:s进行替换。
Flags
1 | g: Global - Apply to each occurence |
Metacharacters (元字符)
vim定义了一些元字符,具有特殊的作用:
.
,*
,\
,[
,^
,$
是元字符,具有特殊意义- Collection:
[1a-c]
: (1, a, b, c), 反选用^
([^a-c]
) - Complete matching:
<str>
不会匹配string
+
,?
,|
,&
,{
,(
,)
需要escaped的方式来使用它们的特殊功能(\+
)- Backreference:
\(str\)
, 之后可以使用\#
进行选择
Meta | Description | |
---|---|---|
. |
任意一个字符 | |
[abc] |
集合中的任意一个字符 | |
\d |
阿拉伯数字 [0-9] , 大写反选 |
|
\x |
十六进制 [0-9A-Fa-f] , 大写反选 |
|
\l |
[a-z] 大写反选 |
|
\u |
[A-Z] 大写反选 |
|
\w |
单词字符[0-9A-Za-z] 大写反选 |
|
\t |
tab | |
\s |
匹配空白字符[ \t] ,大写反选 |
|
^ |
匹配行首 | |
$ |
匹配行尾 | |
\r |
新一行 | |
\n |
null | |
\< |
词首 | |
\> |
词尾 | |
\zs |
patter 的开始 | |
\ze |
patter 的结束 | |
`\ | ` | 或者 |
\& |
分开匹配,匹配项的先后顺序无关 |
关于zs和ze非常好用:
:s/Copyright \zs2007\ze All Rights Reserved/2008/g
就会只替换2007, 能避免我们敲一堆东西
Repetition: 重复
vim可以重复某一匹配patter, 也同样有一些具有重复作用的元字符:
匹配foo以及任意两个字符:
1
\{#\}: (/foo.\{2\})
- 用于重复的元字符:
Meta | Description |
---|---|
* |
匹配0-任意个 |
\+ |
匹配1-任意个 |
\? |
匹配0或1个 |
\{n, m} |
匹配n-m个 |
\{n} |
匹配n个 |
\{n,} |
n-任意个 |
\{,m} |
0-m个 |
Backreference
- 用
\( \)
可以建立一个backreference, 之后使用\#
(#为数字)进行引用:
1 | Original Text: |
Using Current Register or Word
我们有的时候可能首先全文搜索某些东西,然后想直接对其进行替换的话,在搜索完直接替换即可,不需要再次输入search的pattern
1 | :%s//new str/g |
或者我们首先剪切or复制了一些东西,这些内容会被存到寄存器里,(可以通过:reg
)查看这些寄存器里面存的都是啥,
用下面的命令让字符替换为我们寄存器里的值
1 | :s/ffo/<c-r>0/g |
<c-r>
指的是按Ctrl+R,之后指定寄存器的名字即可
Reference:
Changelog
2019-03-08: Fix typo in title (Thanks to Yeezhou Tang)