<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ATEGPU &#187; vi sed bash</title>
	<atom:link href="http://www.ategpu.com/tag/vi-sed-bash/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ategpu.com</link>
	<description>Embedded GPU With OpenGL ES API</description>
	<lastBuildDate>Thu, 12 Aug 2010 12:37:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Linux学习笔记：vi,sed,Bash中的文本替换</title>
		<link>http://www.ategpu.com/2009/12/09/linux%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%9avisedbash%e4%b8%ad%e7%9a%84%e6%96%87%e6%9c%ac%e6%9b%bf%e6%8d%a2.html</link>
		<comments>http://www.ategpu.com/2009/12/09/linux%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%9avisedbash%e4%b8%ad%e7%9a%84%e6%96%87%e6%9c%ac%e6%9b%bf%e6%8d%a2.html#comments</comments>
		<pubDate>Wed, 09 Dec 2009 03:56:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[vi sed bash]]></category>

		<guid isPermaLink="false">http://www.ategpu.com/2009/12/09/linux%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%9avisedbash%e4%b8%ad%e7%9a%84%e6%96%87%e6%9c%ac%e6%9b%bf%e6%8d%a2.html</guid>
		<description><![CDATA[非常实用，转载！
平时工作的时候写不同部分的代码所要遵循的code rule也是不同的，一共有三套code rule，从命名规则，缩进到宏定义限制都相差不少。我有的时候会弄混，发现使用vi和sed可以很快地处理这类问题，把这几天所用过的命令总结了一下，以后也有个参考。
vi用来处理单个文件很合适，并且可以随时undo；sed适合处理多个文件，如果使用了-i选项处理之前最好做备份。
本文中提到的命令均以&#8221;"括起来，实际使用中是不需要输入&#8221;"的。本文中提到的命令都经过测试，但也许还存在问题，可以e-mai我。
使用vi打开一个文本文件时，如果不是以UNIX LF方式结尾，而是以DOS的 CR/LF结尾，会在屏幕的最后以行提示[DOS]字样。使用winCVS的默认设置所抓的code是以CR/LF结尾的，如果是Bash脚本，直接执行的话会报error。
在vi中执行命令前记得使用ESC切换到一般模式。
在vi中使用&#8221;:%! col -bx&#8221;可以去掉CR，或者&#8221;:%s/^M$//g&#8221;。&#8221;^M&#8220;是回车，vi中输入这种特殊字符需要先ctrl+v，然后按下相应的键，这里是回车键。末尾的g表示替换所有的，否则只替换一次。
vi基本的字符串替换如下：
&#8220;:%s/oldstring/newstring/g&#8221; 这个是在全文替换oldstring为newstring，如
&#8220;:%s/^ *//g&#8221; 这条命令去掉所有的行首空格
&#8220;:%s/\t/ /g&#8221; 这条命令把所有的TAB键换成4个空格
也可以指定行（%表示全文），如
&#8220;:123,456 s/old/new/g&#8221; 表示把123到456之间的old替换成new，注意s前有个空格，如果没加这个空格，vi将只显示匹配的结果，但不做替换。（奇怪的是&#8221;:123,456y&#8221;命令不需要加空格）
&#8220;:,$ s/old/new/g&#8221; 表示在当前行到结尾行之间替换
&#8220;:1, s/old/new/g&#8221; 表示从开头当当前行。
&#8220;:g/match/s/old/new/g&#8221; 表示在每个包含match的行中使用new替换old
vi中在编辑模式下输入&#8221;:&#8221;，可以使用上下方向键来选择历史命令。
也可以在命令中使用正则表达式，比如
&#8220;:%s/a[b&#124;c&#124;d]e/afe/g&#8221; 将把匹配&#8221;a[b&#124;c&#124;d]e&#8221;的字符串如&#8221;abe&#8221;"ace&#8221;&#8220;ade&#8221;替换成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 &#8220;*.[ch]&#8221; -exec sed -i &#8217;s/\t/ /g&#8217; {} \;
或者 find . -name &#8220;*.[c&#124;h]&#8221; &#124; xargs sed -i &#8217;s/\t/ /g&#8217;
都可以把当前目录下的.c .h文件中的TAB替换成4个空格。
sed提供的域提取功能可以进行比较复杂的替换如
&#8220;sed &#8217;s/\(\/\/*\)\(.*\)/\/\*\2\*\//&#8216; test.c&#8221;
将把test.c中所有的如&#8221;//comment&#8221; &#8220;int a; //comment&#8221; [...]]]></description>
		<wfw:commentRss>http://www.ategpu.com/2009/12/09/linux%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%9avisedbash%e4%b8%ad%e7%9a%84%e6%96%87%e6%9c%ac%e6%9b%bf%e6%8d%a2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
