我是靠谱客的博主 内向小蝴蝶,最近开发中收集的这篇文章主要介绍vim的查找与替换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

” 替换
:%s/fred/joe/igc : 普通替换命令
:%s/r//g : 删除 DOS 的换行符 ^M

” 你的文本文件是否乱七八糟的排成一行?使用如下命令
:%s/r/r/g : 转换 DOS 回车符 ^M 为真正的回车符
:%s= *$== : 删除行尾空白
:%s= +$== : 同上

:%s#s*r?$## : 删除尾部空白和dos换行符
:%s#s*r*$## : 同上

” 删除空行
:%s/^n{3}// : 删除连续3个空行

:%s/^n+/r/ : 压缩空行,多个替换为一个

:g/^$/d                             删除所有空行  :这个好用有没有人用过还有其他的方法吗?
:g!/^dd/d                               删除不含字符串'dd'的行
:v/^dd/d                               同上  (译释:v  ==& nbspg!,就是不匹配!)
:g/str1/,/str2/d                    删除所有第一个含str1到第一个含str2之间的行
:v/./.,/./-1join                       压缩空行
:g/^$/,/./-j                           压缩空行


” 如果你只想学一招,那么就是这个了
:’a,’bg/fred/s/dick/joe/igc : 非常有用
# ”a,”b指定一个范围:mark a ~ mark b
# g//用一个正则表达式指出了进行操作的行必须可以被fred匹配
# 看后面,g//是一个全局显示命令
# s/dick/joe/igc则对于这些满足条件的行进行替换

” 复制最后一个字段
:%s= [^ ]+$=&&= : 复制最后一个字段

:%s= f+$=&&= : 一样
:%s= S+$=&& : 一样!

” 记忆(反向引用)
:s/(.*):(.*)/2 : 1/ : 将两个字段颠倒
:%s/^(.*)n1$/1/ : 删除重复行

” 非贪婪匹配 {-}

:%s/^.{-}pdf/new.pdf/ : 将第一个pdf的名字换为new.pdf

” 使用可选原子 ?
:%s#<[zy]?tbl_[a-z_]+>#L&#gc : 匹配tbl前面没有字母,或者z和y中的某一个字母,然后将所有的字母变为小写

” 跨越尽量多的行
:%s/<!–_.{-}–>// : 删除多行注释

:help /{-} : 查看非贪婪匹配的更多帮助

” 使用寄存器替换
:s/fred/<c-r>a/g : 将fred替换为寄存器a里的内容,<c-r>为按下Ctrl与r,然后输入a后,寄存器a的内容会出现在命令行
:s/fred/<c-r>asome_text<c-r>s/g

:s/fred/=@a/g : 与第一条的作用相同,但是更优雅一些,因为不会在命令行显示寄存器的内容

” 在一行里写多种命令
:%s/f+.gif>/r&r/g | v/.gif$/d | %s/gif/jpg/ : 将所有带有.gif的行,前后均加入一个空行;将不带有.gif字样的行全部删除;将所有行中的gif换成jpg;注意三条语句,一旦某一条失败,则不执行下面的语句
:%s/a/but/gie|:update|:next : 首先,将当前文件中的所有a变为but;然后保存文件;最后进入下一个文件缓存区。如果有多个文件需要如此处理,可以考虑使用 @:来重复,@:的意义是:执行上一次的命令行命令n次。

” 或运算
:%s/suck|buck/loopy/gc : 替换suck或者buck为loopy(这里|不是管道)

” 调用vim函数
:s/__date__/=strftime(“%c”)/ : 将__date__替换成当前日期,使用strftime函数。注意=表示后面是表达式,结果可能是2008-1-3 17:59:46

” 处理字段,替换所有在第三个字段中的str1为str2
:%s:((w+s+){2})str1:1str2:

” 交换第一列跟第四列
:%s:(w+)(.*s+)(w+)$:321:

” 过滤form中的内容放在寄存器里

:redir @*|sil exec ‘g#<(input|select|textarea|/=form)>#p’|redir END : redir是将执行的结果重定向到后面的*寄存器中,sil是silent
:nmap ,z :redir @*<Bar>sil exec ‘g@<(input<Bar>select<Bar>textarea<Bar>/=form)>@p’<Bar>redir END<CR> : 普通模式下,敲入,z,命令行执行redir @*|sil exec ‘g@<(input|select|textarea|/=form)>@p’|redir END

” 一位以上的数字减3(带进位,这个命令挺有趣)
:%s/d+/=(submatch(0)-3)/

” 包含loc或者functions的行中的数字加6
:g/loc|function/s/d/=submatch(0)+6/

” 比上面更好的方法
:%s#txtdevzsd#=submatch(0)+1#g : zs表示是s要匹配的的内容的开头
:h /zs 查看帮助

” 前缀为gg的数字加6
:%s/(gg)@<=d+/=submatch(0)+6/
:h zero-width 查看帮助

” 替换一个特定字符串为数字
:let i=10 | ‘a,’bg/Abc/s/yy/=i/ |let i=i+1 # 将yy转换成10,11,12等等

” 比上面的更精确
:let i=10 | ‘a,’bg/Abc/s/xxzsyyze/=i/ |let i=i+1 # 将xxyy 转换成 xx11(第一行),xx12(第二行),xx13(第三行)

” 发现要替换的文本,放入内存,然后使用zs来简化替换
:%s/”([^.]+).*zsxx/1/ : zs表示是s要匹配的的内容的开头

” 将光标下的单词,放入替换语句的LHS中
:nmap <leader>z :%s#<<c-r>=expand(“<cword>”)<cr>># : <leader>在没有定义mapleader时为,定义后为mapleader的值。LHS指的是s替换后面,被替换的内容(在左手边)。普通模式下,如果光标下为abc,则输入z两个字符,结果命令行出现:%s#<abc>#,然后你就可以接着输入替换后的内容了。

” 将可视模式下的高亮文本,放入替换语句的LHS中
:vmap <leader>z :<C-U>%s/<<c-r>*>/

—————————————-
” 以下功能相同,在替换语句内部进行替换

” 每行的一部分中,只执行多个单字符的替换
:%s,(all/.*)@<=/,_,g : 用_替换all后的所有/,all/中的/不变

” 功能同上
:s#all/zs.*#=substitute(submatch(0), ‘/’, ‘_’, ‘g’)#

” 通过将一行分开,然后重新组合,达到替换的效果
:s#all/#&^M#|s#/#_#g|-j! : 在windows下使用了mswin的模式,所以^M得输入为r,呵呵

” 在替换命令中使用替换
:%s/.*/=’cp ‘.submatch(0).’ all/’.substitute(submatch(0),’/',’_',’g')/ : 不work,因为all/后面的/和s所有的/有重复。所以我改为 :%s#.*#=’cp ‘.submatch(0).’ all/’.substitute(submatch(0),’/',’_',’g')#

最后

以上就是内向小蝴蝶为你收集整理的vim的查找与替换的全部内容,希望文章能够帮你解决vim的查找与替换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部