Linux学习笔记:vi,sed,Bash中的文本替换
非常实用,转载!
平时工作的时候写不同部分的代码所要遵循的code rule也是不同的,一共有三套code rule,从命名规则,缩进到宏定义限制都相差不少。我有的时候会弄混,发现使用vi和sed可以很快地处理这类问题,把这几天所用过的命令总结了一下,以后也有个参考。
vi用来处理单个文件很合适,并且可以随时undo;sed适合处理多个文件,如果使用了-i选项处理之前最好做备份。
本文中提到的命令均以””括起来,实际使用中是不需要输入””的。本文中提到的命令都经过测试,但也许还存在问题,可以e-mai我。
使用vi打开一个文本文件时,如果不是以UNIX LF方式结尾,而是以DOS的 CR/LF结尾,会在屏幕的最后以行提示[DOS]字样。使用winCVS的默认设置所抓的code是以CR/LF结尾的,如果是Bash脚本,直接执行的话会报error。
在vi中执行命令前记得使用ESC切换到一般模式。
在vi中使用”:%! col -bx”可以去掉CR,或者”:%s/^M$//g”。”^M“是回车,vi中输入这种特殊字符需要先ctrl+v,然后按下相应的键,这里是回车键。末尾的g表示替换所有的,否则只替换一次。
vi基本的字符串替换如下:
“:%s/oldstring/newstring/g” 这个是在全文替换oldstring为newstring,如
“:%s/^ *//g” 这条命令去掉所有的行首空格
“:%s/\t/ /g” 这条命令把所有的TAB键换成4个空格
也可以指定行(%表示全文),如
“:123,456 s/old/new/g” 表示把123到456之间的old替换成new,注意s前有个空格,如果没加这个空格,vi将只显示匹配的结果,但不做替换。(奇怪的是”:123,456y”命令不需要加空格)
“:,$ s/old/new/g” 表示在当前行到结尾行之间替换
“:1, s/old/new/g” 表示从开头当当前行。
“:g/match/s/old/new/g” 表示在每个包含match的行中使用new替换old
vi中在编辑模式下输入”:”,可以使用上下方向键来选择历史命令。
也可以在命令中使用正则表达式,比如
“:%s/a[b|c|d]e/afe/g” 将把匹配”a[b|c|d]e”的字符串如”abe””ace”“ade”替换成afe
正则表达式就不详述了,以后有时间再总结吧。
对于多个命令,可以放到一个文件中,如:
vi a.c b.c c.c -s viscript
viscript可以这样写:
:%s/\t/ /g
:w
:next
:%s/\t/ /g
:w
:next
:%s/\t/ /g
:wq
这很显然不是明智的做法,这里只是举个例子。还是用sed处理多个文件吧。
sed单行命令可以和find, xargs结合起来,完成对多个文件的文本替换。如
find . -name “*.[ch]” -exec sed -i ’s/\t/ /g’ {} \;
或者 find . -name “*.[c|h]” | xargs sed -i ’s/\t/ /g’
都可以把当前目录下的.c .h文件中的TAB替换成4个空格。
sed提供的域提取功能可以进行比较复杂的替换如
“sed ’s/\(\/\/*\)\(.*\)/\/\*\2\*\//‘ test.c”
将把test.c中所有的如”//comment” “int a; //comment” [...]
