vi\vim编辑器批量替换文本与vim正则表达式使用方法

TangLu 未命名 2016-11-22 6946 0

当一个文本中有大量相同内容需要批量替换时,用vi编辑器的查找替换功能非常方便。因为VI编辑器可以通过正则表达式灵活的指定内容。

大致流程如下:

1、首先是进入VI冒号模式

2、然后在冒号模式中指定文本的范围。

3、接着指定替换内容,格式为“地址定界符s/要查找的内容/要替换的内容/修饰符”

最简单的示例:

%s/test/TEST/g  #把所有小写的test替换为大写的TEST
vim格式说明:

首位的s代表替换;三个/成组出现是分隔符,不是必须使用/,用三组一样的符号都可以,如%%%、@@@,可以避免当内容含有/符号时(比如文件路径)需要进行转义的麻烦。;要查找的内容可以使用正则表达式;要替换的内容不能用正则表达式,但可以后向引用。

%s/\/etc\/ssh/\/etc\/sysconfig/g  #需要转意符
%s@/etc/ssh@/ETC/SSH@g  #使用@@@不需要转意了

后项引用规则:

如果要查找的内容有使用分组符号,那么在替换内容中可以使用反斜线“1”或“2”做引用

如果要查找的内容没有进行分组,也可以使用&符号直接引用匹配到的全部内容

示例:

%s@\<t\([[:alpha:]]\+\)@T\1@g  #把所有t开头的单词替换为T开头,这里使用alpha而不使用.*是避免正则贪婪匹配把空格也算做单词的一部分,导致一行文本成了一个单词。然后1则是反向引用了括号里的内容。[[:alpha:]]是posix字符组,相关知识可以网上查阅。

vi编辑器中进行地址定界的常用范围指定符:

/pattern/:pattern是需要匹配的文本内容

“1”:数字是几就代表第几行,仅对一行匹配

“,”:从第几行到第几行,如“1,10”或"/abc/,/xyz/"

“%”:全文匹配

“.”:光标当前行

“$”:最后一行

另外还可以用+-来作相对行匹配,如

.,$-5  #从当前行到倒数第五行

vi编辑器常用修饰符

g:全局,如果不加g的话,只会对每行第一次出现的内容进行匹配。

d:删除

i:不区分大小写


替换文本时如果有多个条件要指定,可以使用“|”符号,如“ab\|ba”匹配'ab'或'ba'

%s@\(enabled\|gpgcheck\)=0@\1=1@g  #这里还用到了分组与后项引用


vi编辑器中常用正则表达式:

. :匹配任何除换行符外的单个字符
^仅匹配行首,也即必须以模式开头
$:仅匹配行尾,也即必须以模式结尾
\< 匹配词首,单词定义为一连串的字母,标点空白和数字均视为分隔符
\> 匹配词尾。

vi编辑器中常用限量符(限量符通常用于指定需要替换的文本出现的次数):
*:前一个字符出现0次或多次,如a*,可以匹配'', 'a', 'aa'或'aaa'等
\+ 前一个字符出现1次或多次
\=前一个字符出现0次或1次
\{n,m} 前一个字符出现n到m,如a\{3,5},则可以匹配'aaa', 'aaaa'或'aaaaa'
\{n} 前一个字符出现n次
\{n,}前一个字符至少出现n次
\{} 0次或多次,与*一致

评论