vi\vim编辑器批量替换文本与vim正则表达式使用方法
当一个文本中有大量相同内容需要批量替换时,用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次或多次,与*一致
评论