Vim中查找替换及正则表达式的使用详解

https://blog.csdn.net/cscrazybing/article/details/53781385

VIM中正则的非贪婪匹配

朋友托我做几个静态页面,由于工作的缘故,已经习惯了使用vim,于是下了个gVim(Vim的win32版本)来对付html源文件。其间有一件很麻烦的重复性工作,是将超链接去掉,如下:


<ahref="/celebrity/1049850/">梅莉莎·罗森伯格</a>
变为
梅莉莎·罗森伯格

一开始人工来处理,在visual模式下倒也还快,不过还是觉得可以用正则替换来做,于是先试匹配

<ahref.*>.∗.∗<\/a>

由于贪婪匹配,vim不会匹配到我所要的结果,尝试使用“\?”加到“*”后面,也不奏效
于是google了一番,知道可以在vim中:hnon-greedy查看有关非贪婪匹配的词条,其中提到使用“\{-}”来代替“*”,于是,这么试:

<ahref.\{-}>.\{-}.\{-}<\/a>

匹配成功,再使用替换命令,一个命令就搞定了之前的工作:

s/<ahref.\{-}>.\{-}.\{-}<\/a>/\1/g

以上例子说明了磨刀不误砍柴工的道理,同时普及了vim中正则的非贪婪匹配技巧。

附上vim中的正则,以备日后参考。

https://blog.csdn.net/fengxinze/article/details/6870106

hello后面空格tab

/hello\s\{1,}

hello后面空格tab换行符

/hello\s\{1,}\nthe

hello     

the

world

/hello\s\{1,}\nthe\nworld

      在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到匹配字符串,把剩下的字符补全,你就不必敲了。这样,编程序时你起多长的变量名都没关系了,:-) 而且还可以减少输入错误。我认为,插入补全是 VIM 最为突出的一项功能。

i<C-P>   向上搜索,补全一个词。例如,上文中出现过 filename 这个词,当你想再输入 filename 时,只要按 f<C-P> 即可。假如 VIM 向上搜索,找到以 f 开头的第一个匹配不是 filename,你可以继续按 <C-P> 搜索下一个匹配进行补全。当然,如果你想一次 <C-P> 就成功,你可以多输入几个字符比如 filen 再按 <C-P> 补全

i<C-N>   向下搜索,补全一个词

i<C-X><C-L>      补全一行。比如你写过一行 for (int i = 0; i < 100; i++),你想再写一模一样的一行,只要输入 for<C-X><C-L> 即可。如果补全出来的不是你想要的那一行,你可以按 <C-P> 或 <C-N> 选择上一个或下一个匹配行
i<C-X><C-F>      在文件系统中搜索,补全一个文件名

如果按 <C-P> 或 <C-N> 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件,而文件的位置将在 path 中搜索。

搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义:
\        取消后面所跟字符的特殊含义。比如
vim
vim
匹配字符串“[vim]”
[]       匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任意字母
[^]      匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符
.        匹配任意字符
*        匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
\+       匹配前一字符大于等于一遍。比如 vi\+m 匹配“vim”、“viim”、“viiim”……
\?       匹配前一字符零遍或者一遍。比如 vi\?m 匹配“vm”或者“vim”
^        匹配行首。例如 /^hello 查找出现在行首的单词 hello
$        匹配行末。例如 /hello$ 查找出现在行末的单词 hello
     括住某段正规表达式
\数字    重复匹配前面某段括住的表达式。例如 hellohello.*\1 匹配一个开始和末尾都是“hello”,中间是任意字符串的字符串

对于替换字符串,可以用“&”代表整个搜索字符串,或者用“\数字”代表搜索字符串中的某段括住的表达式。

举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法:
:%s/abc.∗.∗xyz/xyz\1abc/g
:%s/abcabc.∗.∗xyzxyz/\3\2\1/g
其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern 

例如:在文本中搜索所有包含amount大于0的以[ ] 括住的字符串的行,如 “amount[123]“,  ”amount[200]“ 等:

          首先按 :进入命令 模式,然后输入下面的串再回车开始查找:/amount\[[1-9]\([0-9]*\)\+\] 

     解释如下:

      /  表示进行串搜索, 其它字符为 正则表达式的内容

     amount  表示匹配串包含amount

     \[  转义字符,表示匹配左中括号 [

     [1-9]  表示匹配一位1到9之间任何数字

        转义的左右括号,表示括住某段正则表达式,

    \+  转义字符+,表示前面一个字符或一个正则串重复1次或多次,所以,\([0-9]*\) 表示 任意个0-9之间的数字

    \]   转义字符 ] 
————————————————
版权声明:本文为CSDN博主「fengxinze」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengxinze/article/details/6870106

https://www.jb51.net/article/117930.htm

https://www.cnblogs.com/ifantastic/p/3826433.html

前言

正则表达式是文本处理领域中的一个强大的工具,它可以让文本处理的能力呈指数级的提升,如果一款文本编辑器不支持正则表达式,那么它就算不上是一个现代化的编辑器,这绝非虚言。

下面这篇文章主要跟大家介绍了关于Vim查找替换及正则表达式使用的相关内容,分享出来供大家参考学习,下面来一起看看吧。

简单替换表达式

:[range]s/from/to/[flags]

range:搜索范围,如果没有指定范围,则作用于但前行。

  • :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
  • :10s/from/to/ 表示只在第10行搜索替换;
  • :%s/from/to/ 表示在所有行中搜索替换;
  • 1,$s/from/to/ 同上。

flags 有如下四个选项:

  • c confirm,每次替换前询问;
  • e error, 不显示错误;
  • g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
  • i ignore,忽略大小写。

这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问。

正则表达式

1、元字符

元字符

元字符 说明
. 匹配任意字符
[abc] 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc] 匹配除方括号中字符之外的任意字符
\d 匹配阿拉伯数字,等同于[0-9]
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x 匹配十六进制数字,等同于[0-9A-Fa-f]
\X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l 匹配[a-z]
\L 匹配[^a-z]
\u 匹配[A-Z]
\U 匹配[^A-Z]
\w 匹配单词字母,等同于[0-9A-Za-z_]
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t 匹配<TAB>字符
\s 匹配空白字符,等同于[\t]
\S 匹配非空白字符,等同于[^\t]

一些普通字符需转意

元字符 说明
\* 匹配* 字符
. 匹配. 字符
\/ 匹配 / 字符
\ 匹配 \ 字符
\[ 匹配 [ 字符
\] 匹配 ] 字符

表示数量的元字符

元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个

表示位置的元字符

元字符 说明
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾

2、替换变量

在正则式中以\(和\)括起来的正则表达式,在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容。

例子

  • 删除行尾空格::%s/\s+$//g
  • 删除行首多余空格:%s/^\s*// 或者 %s/^ *//
  • 删除沒有內容的空行:%s/^$// 或者 g/^$/d
  • 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
  • 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
  • 把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
?
1
2
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

搜索单词

Vim中使用 \< 和 \> 分别表示单词的开头和结尾,例如查找单词 i 而不是字母 i ,在正常模式下,按下 / 启动搜索模式,输入 \<i\> ,敲击回车即可。

要查找当前光标覆盖的单词,敲击 * ,Vim会自动启动搜索模式,光标移动到该单词下一个现身位置。

搜索当前单词并连续修改

假定当前光标覆盖的单词为 foo,按下 * 键,Vim 会搜索并跳转到下一个 foo 的位置,按下 ciw 组合键,意思是 change inner word ,此时 foo 会被删除,在原位置输入 bar ,然后按下 Escape 键。这就完成了一次搜索并修改,接下来按 n 键继续搜索,如果还需要修改,则按下 . 键表示重复修改动作,如此反复完成连续搜索与修改。

搜索连续重复单词

有时你可能会连续重复输入同一个单词而不自知,例如以下文本:

1 hello hello 2 world  world 3 thank 4 thank

搜索模式:

\(\<\w\+\>\)\_s*\1

以上搜索模式会匹配文本中的1-4行。在Vim中,使用 \( 和 \) 包括的部分视为一个原子,其中 \(\<\w\+\>\) 匹配一个单词原子,\s 匹配空格符和tab符, \_s 匹配空格符、tab符和换行符, \_s* 匹配0次或多次。 

搜索A或B

使用 \| 表示或逻辑,例如 red\|green\|blue 匹配字符串(注意不是单词)red或green或blue。

如果要将匹配的对象替换成新的字符串,可以使用 :%s/搜索正则/新字符串/g,例如将所有的red或green字符串替换为purple:

:%s/red\|green/purple/g

替换所有单词red或green为单词purple:

:%s/\<\(red\|green\)\>/purple/g

 

Vim具有搜索模式记忆,因此以上命令也可以拆解为两步:

第一步:搜索单词red或green:

/\<\(red\|green\)\>

第二步:将搜索结果替换为purple:

:%s//purple/g

替换命令中搜索正则为空时,Vim会直接使用最后一次使用过的搜索正则作为默认表达式。

 

有时我们并不想替换结果,而是想要对结果做一些装点,那么可以使用 & 来引用搜索结果,例如以下示例会将文本中所有的单词red或green添加上引号:

:%s/\<\(red\|green\)\>/"&"/g

或者使用分组 \1, \2, \3 ... 来引用搜索结果:

:%s/\<\(red\|green\)\>/"\1"/g
  • 搜索与替换

:substitute 命令搜索一个字符串并将其替换为新字符串,以下为一些基本使用方法。

复制代码
:%s/foo/bar/g
    全文搜索每个foo并替换为bar。

:s/foo/bar/g
    当前行搜索每个foo并替换为bar。

:%s/foo/bar/gc
    全文搜索每个foo并替换为bar,替换前需要确认。

:%s/\<foo\>/bar/gc
    全文搜索每个单词foo并替换为bar,替换前需要确认。

:%s/foo/bar/gci
    全文搜索每个foo并替换为bar,替换前需要确认,大小写不敏感。

:%s/foo/bar/gcI
    全文搜索每个foo并替换为bar,替换前需要确认,大小写敏感。

标记g:表示全局搜索,对每一个匹配结果进行操作,缺省标记g,则只对第一个匹配结果进行操作。
标记c:表示操作前需要进行确认。
标记i:表示大小写不敏感。
标记I:表示大小写敏感。
复制代码
  • 搜索分组

使用 \( 和 \) 包围住表达式使其成为一个原子,并根据原子所处位置顺序使用\1,\2,……来引用相应的匹配结果。最常见的场景莫过于对调字符串位置,例如:

复制代码
原文:
1. France VS Germany

命令:
:s/\(France\)\(\sVS\s\)\(Germany\)/\3\2\1

结果:
1. Germany VS France
复制代码

搜索A与B

使用 \& 表示与逻辑,例如搜索同时包含了 red 和 blue 的行。进行与逻辑搜索时,Vim按照由 \& 分隔的表达式顺序逐一匹配,因此如果开启了高亮匹配结果的功能,那么你看到高亮匹配的永远都是最后一个表达式的匹配结果。

/.*red\&.*blue

反向肯定预查搜索

使用 \(expression1\)\@<=expression2 表示反向肯定预查搜索模式,其过程为首先搜索 \@<= 右侧的原子即 expression2,遇到匹配项后再检查匹配结果左侧是否满足 expression1。例如以下命令会搜索多个冗余0的数字。

复制代码
原文: 1.0 1.000 1.0100 命令:
\(\.\d\+\)\@<=0\+\>

结果:
匹配了1.000后两个0,1.0100后两个0。
    A+
发布日期:2020年01月19日  所属分类:未分类

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: