vim字符串替换及⼩技巧
字符串替换
vi/vim 中可以使⽤ :s 命令来替换字符串。以前只会使⽤⼀种格式来全⽂替换,今天发现该命令有很多种写法(vi 真是强⼤啊,还有很多需要学习),记录⼏种在此,⽅便以后查询。
  :s/vivian/sky/ 替换当前⾏第⼀个 vivian 为 sky
  :s/vivian/sky/g 替换当前⾏所有 vivian 为 sky
  :n,$s/vivian/sky/ 替换第 n ⾏开始到最后⼀⾏中每⼀⾏的第⼀个 vivian 为 sky
  :n,$s/vivian/sky/g 替换第 n ⾏开始到最后⼀⾏中每⼀⾏所有 vivian 为 sky
  n 为数字,若 n 为 .,表⽰从当前⾏开始到最后⼀⾏
  :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每⼀⾏的第⼀个 vivian 为 sky
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每⼀⾏中所有 vivian 为 sky
  可以使⽤ # 作为分隔符,此时中间出现的 / 不会作为分隔符
  :s#vivian/#sky/# 替换当前⾏第⼀个 vivian/ 为 sky/
  :%s+/oradata/apras/+/user01/apras1+ (使⽤+ 来替换 / ): /oradata/apras/替换成/user01/apras1/
  * ************************************
  1.:s/vivian/sky/ 替换当前⾏第⼀个 vivian 为 sky
  :s/vivian/sky/g 替换当前⾏所有 vivian 为 sky
  2. :n,$s/vivian/sky/ 替换第 n ⾏开始到最后⼀⾏中每⼀⾏的第⼀个 vivian 为 sky
  :n,$s/vivian/sky/g 替换第 n ⾏开始到最后⼀⾏中每⼀⾏所有 vivian 为 sky
  (n 为数字,若 n 为 .,表⽰从当前⾏开始到最后⼀⾏)
  3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每⼀⾏的第⼀个 vivian 为 sky
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每⼀⾏中所有 vivian 为 sky
  4. 可以使⽤ # 作为分隔符,此时中间出现的 / 不会作为分隔符linux使用vim编辑文件
  :s#vivian/#sky/# 替换当前⾏第⼀个 vivian/ 为 sky/
  5. 删除⽂本中的^M
  问题描述:对于换⾏,window下⽤回车换⾏(0A0D)来表⽰,linux下是回车(0A)来表⽰。这样,将window上的⽂件拷到unix上⽤时,总会有个^M.请写个⽤在unix下的过滤windows⽂件的换⾏符(0D)的shell或c程序。
  · 使⽤命令:cat filename1 | tr -d “V M” >newfile;
  · 使⽤命令:sed -e “s/V M//” filename >outputfilename。需要注意的是在1、2两种⽅法中,V和M指的是Ctrl+V和Ctrl+M。你必须要⼿⼯进⾏输⼊,⽽不是粘贴。
  · 在vi中处理:⾸先使⽤vi打开⽂件,然后按ESC键,接着输⼊命令:%s/V M//。
  · :%s/^M$//g
  如果上述⽅法⽆⽤,则正确的解决办法是:
  · tr -d "r" <src >dest
  · tr -d "5" dest
  · strings A>B
  6. 其它
  利⽤ :s 命令可以实现字符串的替换。具体的⽤法包括:
  :s/str1/str2/ ⽤字符串 str2 替换⾏中⾸次出现的字符串 str1
  :s/str1/str2/g ⽤字符串 str2 替换⾏中所有出现的字符串 str1
  :.,$ s/str1/str2/g ⽤字符串 str2 替换正⽂当前⾏到末尾所有出现的字符串 str1
  :1,$ s/str1/str2/g ⽤字符串 str2 替换正⽂中所有出现的字符串 str1
  :g/str1/s//str2/g 功能同上
  从上述替换命令可以看到:g 放在命令末尾,表⽰对搜索字符串的每次出现进⾏替换;不加 g,表⽰只对搜索
  字符串的⾸次出现进⾏替换;g 放在命令开头,表⽰对正⽂中所有包含搜索字符串的⾏进⾏替换操作。
前⼏天我记录⼀下如何在vim中替换⽂字。只是很简单的给出了两个命令。其实还只是初级功能,今天来看看稍微复杂⼀点的。
⽤:%s/from/to 命令只替换每⾏的第⼀个匹配字符,如果要替换每⾏的所有匹配项,需要在后⾯加上g命令。如: :%s/from/to/g
另外,我们往往在替换的时候需要很⼩⼼,不能够这样就全部替换了,需要我们⼀个个的确认,那么我们可以加上c命令,意思就是confirm。如: :%s/from/to/gc 输⼊这个命令之后,vim会把所有匹配的⽂字⾼亮,并会询问你replace with to (y/n/a/q/l/^E/^Y) ,输⼊y表⽰替换当前这个,n表⽰这个不要替换,a表⽰全部替换,q表⽰退出,不替换了,l表⽰把当前这个替换后就退出,^E(ctrl+e,好像⼤⼩写都可以)表⽰向下滚动⼀⾏,^Y表⽰向上滚动⼀⾏.
上次我们说了可以在s前⾯加上范围,⽐如:1,5s/from/to表⽰替换1到5⾏的from,在vim中有些字符可以很⽅便的表⽰⼀些特殊⾏,⽐如.表⽰当前⾏,\(表⽰最后⼀⾏,第⼀⾏当然就是1了.所以我们可以⽤:.s/from/to命令替换当前⾏的from,⽤:.,\)s/from/to替换从当前⾏到结束⾏的每⾏的第⼀个匹配的from.
好了现在对于vim的⽂字替换功能有了更⼀步的了解了.其实这样的替换还是最简单的,并且很容易出错,因为它并不会断词,会把fromxxx也当成匹配项,这当然是错误的,我们可以加上\<;来表⽰匹配⼀个单词的开始,\>来表⽰单词的结束, 命令看起来就像这个样⼦:%s/\<from\>/to/g
:%s/\r//g清除那个^M
linux使⽤grep或者vim删除空⾏
grep -v ^$ oldfile > newfile但是似乎在FreeBSD下⾯不⾏,会不会是grep版本的问题? 后来想到了很刁的vim的全局替换,最后成功
vim的命令为:%s/^\n//g意思是全局替换所有以回车开头的字符,替换为空。
顺便研究了⼀下如果有多个连续的空⾏,想保留⼀个 vim的命令为:%s/^\n$//g
VIM对中⽂编码的⽀持
1、⽀持中⽂编码的基础
Vim要更好地⽀持中⽂编码需要两个特性:+multi_byte和+iconv,可以⽤|:version|命令检查当前使⽤的Vim是否⽀持,否则的话需要重新编译。
2、影响中⽂编码的设置项
Vim中有⼏个选项会影响对多字节编码的⽀持:
encoding(enc):encoding是Vim的内部使⽤编码,encoding的设置会影响Vim内部的Buffer、消息⽂字等。在 Unix环境下,encoding的默认设置等于locale;Windows环境下会和当前代码页相同。在中⽂Windows环境下encoding的默认设置是cp936(GBK)。 fileencodings(fenc):Vim在打开⽂件时会根据fileencodings选项来识别⽂件编码,fileencodings可以同时设置多个编码,Vim会根据设置的顺序来猜测所打开⽂件的编码。
fileencoding(fencs):Vim在保存新建⽂件时会根据fileencoding的设置编码来保存。如果是打开已有⽂件,Vim会根据打开⽂件时所识别的编码来保存,除⾮在保存时重新设置fileencoding。 termencodings(tenc):在终端环境下使⽤Vim时,通过termencoding项来告诉Vim终端所使⽤的编码。
3、Vim中的编码转换
Vim内部使⽤iconv库进⾏编码转换,如果这⼏个选项所设置的编码不⼀致,Vim就有可能会转换编码。打开已有⽂件时会从⽂件编码转换到encoding所设置的编码;保存⽂件时会从encoding设置的编码转换到fileencoding对应的编码。经常会看到Vim提⽰[已转换],这是表明Vim 内部作了编码转换。终端环境下使⽤Vim,会从termencoding设置的编码转换到encoding设置的编码。
可以⽤|:help encoding-values|列出Vim⽀持的所有编码。
4、具体应⽤环境的设置
只编辑GBK编码的⽂件
set fileencodings=cp936 set fileencoding=cp936 set encoding=cp936
只编辑UTF-8编码的中⽂⽂件
set fileencodings=utf-8 set fileencoding=utf-8 set encoding=cp936 或者 set encoding=utf-8
同时⽀持GBK和UTF-8编码
set fileencodings=ucs-bom,utf-8,cp936 set fileencoding=utf-8 set encoding=cp936 或者 set encoding=utf-8
如果在终端环境下使⽤Vim,需要设置termencoding和终端所使⽤的编码⼀致。例如:
set termencoding=cp936 或者 set termencoding=utf-8
Windows记事本编辑UTF-8编码⽂件时会在⽂件头上加上三个字节的BOM:EFBBBF。如果fileencodings中设置ucs-bom的⽬的就是为了能够兼容⽤记事本编辑的⽂件,不需要的话可以去掉。Vi
m在保存UTF-8编码的⽂件时会去掉BOM。去掉BOM的最⼤好处是在Unix下能够使⽤cat a b>c来正确合并⽂件,这点经常被忽略。
5、FAQ
为什么在Vim中⼀次只能删除半个汉字?
因为encoding设置错误,把encoding设置为cp936就可以解决此问题。在Unix环境下Vim会根据locale来设置默认的encoding,如果没有正确设置locale并且没有设置encoding就会⼀次只能删除半个汉字。
VIM为什么不能输⼊繁体字?
把euc-cn或者GB2312改为cp936就可以了。euc-cn是GB2312的别名,不⽀持繁体汉字。cp936是GBK的别名,是GB2312的超集,可以⽀持繁体汉字。
VIM为什么提⽰不能转换?
因为在编译Vim时没有加⼊iconv选项,重新编译Vim才能解决。
如何打开⼀个GBK编码的⽂件并另存为UTf-8编码?
保存⽂件时运⾏命令|:set fileencoding=utf-8|就可以了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。