Vim Search & Replacement & Regex(with Zero Width)

Vim Search & Replacement & Regex (with Zero Width)

Options

  • g Replace all occurrences in the line (without g - only first).
  • c 表示进行确认
  • p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
  • 省略option时仅对每行第一个匹配串进行替换;

magic

  • magic (\m):除了 \$ . * ^ 之外其他元字符都要加反斜杠。
  • nomagic (\M):除了 \$ ^ 之外其他元字符都要加反斜杠。 这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理,\M 后面的正则表达式按照 nomagic 处理, 而忽略实际的magic设置。
    Example
    1
    2
    /\m.* # 查找任意字符串
    /\M.* # 查找字符串 .* (点号后面跟个星号)

另外还有更强大的 \v 和 \V。

  • \v (即 very magic 之意):任何元字符都不用加反斜杠
  • \V (即 very nomagic 之意):任何元字符都必须加反斜杠
Example
1
2
3
4
/\v(a.c){3}$ # 查找行尾的abcaccadc
/\m(a.c){3}$ # 查找行尾的(abc){3}
/\M(a.c){3}$ # 查找行尾的(a.c){3}
/\V(a.c){3}$ # 查找任意位置的(a.c){3}$

默认设置是 magic,vim也推荐大家都使用magic的设置,在有特殊需要时,直接通过 \v\m\M\V 即可。

贪婪or非贪婪

  • 正常搜索都是贪婪 (*)
  • \{-}为非贪婪
1
2
3
4
5
\{-n,m} matches n to m of the preceding atom, as few as possible
\{-n} matches n of the preceding atom
\{-n,} matches at least n of the preceding atom, as few as possible
\{-,m} matches 0 to m of the preceding atom, as few as possible
\{-} matches 0 or more of the preceding atom, as few as possible
example
1
2
3
abbbbbbbc
abcccc
abcbbcbcbc
1
2
3
4
5
/a.\{-\}c
get
abbbbbbc
abc
abc
1
2
3
4
5
/a.*c
get
abbbbbbbc
abcccc
abcbbcbcbc

Zero-Width

1
2
3
1.jpg
2.jpg
3.jpg

With very magic(preferrted)

1
/\v\d(.jpg)@=

And with no very magic:

1
/\d\(abc\)\@=

Example

从m到n行所有的str1替换成str2

1
:m,ns/str1/str2/g

替换^M 字符

1
:1,$s/^M//g

当前行到最后

. ,$

删除空行

1
2
3
4
5
6
7
8
9
10
11
12
13
刪除沒有內容的空行
:1,g/^$/d
刪除包含有空格組成的空行
:1,g/^\s*$/d
除以空格或tab開頭到結尾的空行
:1,g/^[ |\t]*$/d
```
注意`1,g`是到光标所到的行
#### 将That or this 换成 This or that

:%s/(That) or (this)/\u\2 or \l\1/

1
2
#### 将句尾的child换成children

:%s/child([ ,.;!:?])/children\1/g

1
#### 将mgi/r/abox换成mgi/r/asquare

:g/mg([ira])box/s//mg//my\1square/g <=> :g/mg[ira]box/s/box/square/g

1
2
#### 将多个空格换成一个空格

:%s/ */ /g

1
2
#### 使用空格替换句号或者冒号后面的一个或者多个空格

:%s/([:.]) */\1 /g

1
2
#### 删除所有空行

:g/^$/d

1
2
#### 删除所有的空白行和空行

:g/^[ ][ ]*$/d

1
2
#### 在每行的开始插入两个空白

:%s/^/> /

1
#### 在接下来的6行末尾加入.

:.,5/$/./

1
2
#### 颠倒文件的行序

:g/.*/m0O <=> :g/^/m0O

1
#### 寻找不是数字的开始行,并将其移到文件尾部

:g!/^[0-9]/m$ <=> g/^[^0-9]/m$

1
2
#### 将文件的第12到17行内容复制10词放到当前文件的尾部

:1,10g/^/12,17t$

1
2
3
4
#### 重复次数的作用
将chapter开始行下面的第二行的内容写道begin文件中

:g/^chapter/.+2w>>begin
:/^part2/,/^part3/g/^chapter/.+2w>>begin
:/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$

1
2
3
#### 替换上一次搜索结果

:%s//new/g

1
#### 在第一个字母后面加y

:%s/\v(\w)(\w\w)/\1y\2/g

1
2
3
#### `&`的使用
**&** the whole matched pattern

:%s/^./&y

%s applies the pattern to the whole file.
^. matches the first character of the line.
&y adds the y after the pattern.

```