<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>joeh</title>
	<atom:link href="http://joeh.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://joeh.wordpress.com</link>
	<description>hq00e的新居@wordpress.com</description>
	<lastBuildDate>Sat, 28 Jan 2006 13:54:37 +0000</lastBuildDate>
	<language></language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='joeh.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>joeh</title>
		<link>http://joeh.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://joeh.wordpress.com/osd.xml" title="joeh" />
	<atom:link rel='hub' href='http://joeh.wordpress.com/?pushpress=hub'/>
		<item>
		<title>打印斐波那契序列的sed脚本</title>
		<link>http://joeh.wordpress.com/2006/01/28/sed-fib/</link>
		<comments>http://joeh.wordpress.com/2006/01/28/sed-fib/#comments</comments>
		<pubDate>Sat, 28 Jan 2006 13:50:50 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/28/sed-fib/</guid>
		<description><![CDATA[将这个脚本放在这里基于两个目的： 这个脚本中用了许多的循环结构可作为上一篇的补充。 同时这一篇用了模拟的数字运算——了解这种运算方法有助于以后学习一些经典的sed脚本或写出自已的算术脚本 by hq00e # 打印斐波那契序列 # 文件名：fib.sed # 调用：seq 10 &#124; sed -f fib.sed # 打印前10个数字 # yes &#124; sed -f fib.sed # 打印序列直到溢出 # 这个脚本用模拟的方式进行数字运算。有关这种方法的更 # 多细节可以参考Greg Ubben写的教程： # http://sed.sourceforge.net/grabbag/tutorials/ 1{ # 下面字母串的长度决定了可打印的序列长度 # 可以修改下面的字串使之支持更多的序列 # s/.*/zyxwvutsrqponmlkjihgfedcba/ s/.*/kjihgfedcba/ # 初始化序列为“1, 1” s/.*/ &#38;a &#38;a /; h; d } # 从hs取最后两组数字串进行运算 g s/.* [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=18&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<blockquote><p>将这个脚本放在这里基于两个目的：</p>
<ul>
<li>这个脚本中用了许多的循环结构可作为上一篇的补充。</li>
<li>同时这一篇用了模拟的数字运算——了解这种运算方法有助于以后学习一些经典的sed脚本或写出自已的算术脚本</li>
</ul>
<p>by hq00e</p></blockquote>
<pre>
# 打印斐波那契序列
# 文件名：fib.sed
# 调用：seq 10 | sed -f fib.sed  # 打印前10个数字
#       yes | sed -f fib.sed     # 打印序列直到溢出

# 这个脚本用模拟的方式进行数字运算。有关这种方法的更
# 多细节可以参考Greg Ubben写的教程：
# http://sed.sourceforge.net/grabbag/tutorials/

1{
# 下面字母串的长度决定了可打印的序列长度
# 可以修改下面的字串使之支持更多的序列
# s/.*/zyxwvutsrqponmlkjihgfedcba/
  s/.*/kjihgfedcba/
# 初始化序列为“1, 1”
  s/.*/ &amp;a &amp;a /; h; d
}

# 从hs取最后两组数字串进行运算
g
s/.* &#92;(.*&#92;) &#92;(.*&#92;) $/&#92;1&#92;2/

# 进行进位操作前先对两组数字加总（其实是排序）
s/&#92;(&#92;(.&#92;)&#92;2*&#92;)/&#92;1 /g
:lpsort
s/&#92;(&#92;([^ ]&#92;)&#92;2&#92;{0,&#92;}&#92;)&#92;( .*&#92;)&#92;2/&#92;1&#92;2&#92;3/
tlpsort
s/ //g

# 调整加总的结果
# 加总时我们进行如下运算：
# edcbaa + edcbaaa = edcbaaaa
#    1   +    2    =     3
# 但实际在加总（排序）后我们等到的结果是：
# edcbaa + edcbaaa = eeddccbbaaaaa
# 我们需要将eeddccbbaaaaa转换为edcbaaaa

s/&#92;(.&#92;)&#92;(&#92;1&#92;{1,19&#92;}&#92;)/&#92;2/g

# 进行进位操作。
# baaaaaaaaaaa进位后成为bba——10

:doCarry
s/&#92;(.&#92;)&#92;(&#92;(.&#92;)&#92;3&#92;{9&#92;}&#92;)&#92;3/&#92;1&#92;1&#92;3/
t doCarry

# 简单（粗糙）的溢出检验
# 因为第一个字母如果超过9个说明没有正常进位——即溢出
/^&#92;(.&#92;)&#92;1&#92;{9&#92;}/{g;s/$/ ++OVERFLOW++/; b2digi}

# 将这一轮的结果保存到hold space。记得在最后加上一个空格。
G
s/&#92;(.*&#92;)&#92;n&#92;(.*&#92;)/&#92;2&#92;1 /
$!{h;d}
g

# 运算完后将模拟结果转为数字表示的结果
:2digi
s/&#92;([a-z]&#92;)&#92;1&#92;{9&#92;}/9/g
s/&#92;([a-z]&#92;)&#92;1&#92;{8&#92;}/8/g
s/&#92;([a-z]&#92;)&#92;1&#92;{7&#92;}/7/g
s/&#92;([a-z]&#92;)&#92;1&#92;{6&#92;}/6/g
s/&#92;([a-z]&#92;)&#92;1&#92;{5&#92;}/5/g
s/&#92;([a-z]&#92;)&#92;1&#92;{4&#92;}/4/g
s/&#92;([a-z]&#92;)&#92;1&#92;{3&#92;}/3/g
s/&#92;([a-z]&#92;)&#92;1&#92;1/2/g
s/&#92;([a-z]&#92;)&#92;1/1/g
s/&#92;([a-z]&#92;)/0/g
s/ 0*/ /g
# 溢出检验需要q命令
q
</pre>
<p>[--结束--]</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=18&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/28/sed-fib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>sed中的循环结构</title>
		<link>http://joeh.wordpress.com/2006/01/28/sed-itera/</link>
		<comments>http://joeh.wordpress.com/2006/01/28/sed-itera/#comments</comments>
		<pubDate>Sat, 28 Jan 2006 13:43:06 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/28/sed-itera/</guid>
		<description><![CDATA[Table of Contents sed中的循环结构 在sed中进行判断 用holdspace储存标志位 用pattern space储存标志位 用地址进行判断 用式样进行判断 循环常用的命令解析 b/t控制循环 退出条件 d/D控制循环 标志位控件循环 N作为退出条件 实例 Up:&#160;(dir) sed中的循环结构 这篇文章粗略地总结了一些在sed进行循环操作的方法。的确是很粗糙但为了在农历年前放上就不管那么多了。 by hq00e 一些缩写 ps=pattern space，式样空间 hs=hold space，保留空间 regexp=regular expression， 正则表达式 循环都可以写为条件转移的形式。如C语言中的if加goto的形式，但这与结构化编程的思想相违背。因而C语言中通常用for&#92;while来写循环语句。但在被编译后程序的机器代码仍是以条件转移的形式出现的。sed没有专门的循环语句，但提供了转移的命令，因而我们仍然可以实现循环。本篇中总结用sed进行循环的几种方式。sed处理文本的方式本身就是一种循环： do while not EOF read line ... do sth end do。 Next:&#160;sect2, Up:&#160;Top 在sed中进行判断 因为sed只处理字符和行号，它只能通过式样来作字串的匹配判断或者对行号进行判断。所以判断的条件需要以字串或行号的形式出现。 用holdspace储存标志位 在hs中存储字串作为标志位，如： # 进行6次操作 1{x; s/^/654321/; x} :a x; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=17&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div>
<h2>Table of Contents</h2>
<ul>
<li><a name="toc_Top" href="#Top">sed中的循环结构</a>
<ul>
<li><a href="#sect1">在sed中进行判断</a>
<ul>
<li><a href="#sect1">用holdspace储存标志位</a>
<li><a href="#sect1">用pattern space储存标志位</a>
<li><a href="#sect1">用地址进行判断</a>
<li><a href="#sect1">用式样进行判断</a>
</li>
</ul>
<li><a href="#sect2">循环常用的命令解析</a>
<ul>
<li><a href="#sect2">b/t控制循环</a>
<ul>
<li><a href="#sect2">退出条件</a>
</li>
</ul>
<li><a href="#sect2">d/D控制循环</a>
<li><a href="#sect2">标志位控件循环</a>
<li><a href="#sect2">N作为退出条件</a>
</li>
</ul>
<li><a href="#sect3">实例</a>
</li>
</ul>
</li>
</ul>
</div>
<div>
<p>
<hr />
<a name="Top"></a><br />
Up:&nbsp;<a rel="up" href="#dir">(dir)</a></p>
</div>
<h2>sed中的循环结构</h2>
<blockquote><p>这篇文章粗略地总结了一些在sed进行循环操作的方法。的确是很粗糙但为了在农历年前放上就不管那么多了。<br />
by hq00e</p></blockquote>
<p>一些缩写<br />
ps=pattern space，式样空间<br />
hs=hold space，保留空间<br />
regexp=regular expression， 正则表达式</p>
<p>循环都可以写为条件转移的形式。如C语言中的if加goto的形式，但这与结构化编程的思想相违背。因而C语言中通常用for&#92;while来写循环语句。但在被编译后程序的机器代码仍是以条件转移的形式出现的。sed没有专门的循环语句，但提供了转移的命令，因而我们仍然可以实现循环。本篇中总结用sed进行循环的几种方式。sed处理文本的方式本身就是一种循环：</p>
<pre>
do while not EOF
 read line
   ... do sth
 end do。
</pre>
<div>
<p>
<hr />
<a name="sect1"></a><br />
Next:&nbsp;<a rel="next" href="#sect2">sect2</a>,<br />
Up:&nbsp;<a rel="up" href="#Top">Top</a></p>
</div>
<h3>在sed中进行判断</h3>
<p>因为sed只处理字符和行号，它只能通过式样来作字串的匹配判断或者对行号进行判断。所以判断的条件需要以字串或行号的形式出现。</p>
<h4>用holdspace储存标志位</h4>
<p>在hs中存储字串作为标志位，如：<br />
<a name="ps"></a></p>
<pre>
# 进行6次操作
1{x; s/^/654321/; x}
 :a
 x;
 /./{ s/.//; x; s/reg/ex/; ba}
 x;
 do sth else;

# 对每一行进行6次替换操作
1{x; s/^/654321/; x}
G
:a
/&#92;n./{ s/reg/ex/; s/&#92;n.$//; tb; s/.$//; ba}
:b
do sth else
</pre>
<h4>用pattern space储存标志位</h4>
<p>用pattern space(标志位附加在前面或后面)，与hs的方式基本一样只是将标志位放在ps中。</p>
<pre>
1{ s/^/654321&#92;n/ }
:a
/.&#92;n/{ s/.//; s/reg/ex/; ba }
do sth else
</pre>
<h4>用地址进行判断</h4>
<p>地址（常用的地址是1,$）。当循环的条件与地址或行号有关时可以以这种方式。</p>
<pre>
sed &#39;/./{H;d};x;/re/p&#39; # 显示某个段落
2,8{H;d}; $G  # 类似ed中的:2,8m$。d在这里有两个作用a清空PS。b强制进入下一cycle。
</pre>
<h4>用式样进行判断</h4>
<p>以当前ps的内容作为判断的标准，当循环条件与输入的内容有关时可以用这种方法。这样方法与标志位的方法相似，所不同的是我们并不人为地设置标志而是以当前ps的内容作为标志。请参考下面的例子：</p>
<pre>
:a
 do sth with regexp
/regexp/ba
</pre>
<p>如果中间有s命令我们常用t来跳转，因而上面的可以写为：<br />
:a<br />
 s/regexp/blah/<br />
ta</p>
<div>
<p>
<hr />
<a name="sect2"></a><br />
Next:&nbsp;<a rel="next" href="#sect3">sect3</a>,<br />
Previous:&nbsp;<a rel="previous" href="#sect1">sect1</a>,<br />
Up:&nbsp;<a rel="up" href="#Top">Top</a></p>
</div>
<h3>循环常用的命令解析</h3>
<p>q, b, t, T, d, n, N, :label</p>
<h4>b/t控制循环</h4>
<p><strong>b都是sed中的分支（跳转）命令</strong>。它的格式是`b label&#8217;，也可以去掉中间的空格，写作`blabel&#8217;。上面命令的作用是从:label处继续执行脚本。label必须在脚本中定义，方法是在前面加上冒号（:），如`:loop&#8217;`:lable&#8217;。大部分sed对标签的长度有限制，具体的限制可以参考sed faq。如果b后没有带标签，则默认转到脚本结束处。<br />
要注意的是许多的sed不允许在后面接其他命令因而：<br />
gsed &#39;b abc;s/^/eee/;:abc;&#8230;&#39;<br />
这样的命令在其他版本的sed中要写成：</p>
<pre>
sed &#39;b abc
      s/^/eee/
     :abc&#39;
或：
sed -e &#39;b abc&#39; -e &#39;s/^/eee/; :abc&#39;
</pre>
<p><strong>t命令与b相似</strong>。不同点在于t是以前s命令的成功与否来决定是否跳转，如成功则跳转。如果在一个s命令后使用了多个条件跳转则第二个及其后的t都会失败。gnu sed还提供了与t相反的T命令。</p>
<pre>
$ echo abc|sed &#39;s/a/a/;bb;:b;tc;s/^/zzz/;:c&#39;
abc

$ echo abc|sed &#39;s/a/a/;tb;:b;tc;s/^/zzz/;:c&#39;
zzzabc

$ echo abc|sed &#39;s/a/a/;tb;:b;tc;s/^/zzz/;:c&#39;
zzzabc
</pre>
<p><strong>b/t控制循环</strong>：<br />
s/re/&amp;/;t<br />
s/re/&amp;/;T<br />
与<br />
/re/b<br />
/re/!b<br />
是等价的。但在下面的内容中我们会看到s/t的组合可以用在一些更复杂的情况。</p>
<p>当作用b进行循环时常用下面的方式退出循环：<br />
在b前使用式样或地址（循环条件）：</p>
<pre>
:a
...
/regexp/ba
</pre>
<p>上面的情况通常要求中间的语句对/regexp/进行修改或有另外的退出命令，才不会成为死循环。</p>
<h5>退出条件</h5>
<p>使用b/t循环时，为了避免出现死循环通常要设置退出的条件。如：</p>
<pre>
:a
...
/xxx/b
...
/regexp/ba
</pre>
<p>除了用b外还可以用t, N, q, d作为退出的命令，用式样或行号作为退出的条件。当前面有成功的替换时，可用`t&#8217;转移动脚本中的任意位置——当然也可以跳出循环体。在最后一行使用N会退出脚本，利用这一点我们可以退出循环体。不过不同版本的sed在最后一行使用`N&#8217;时的结果不同——有的会显示ps的内容，有的则不会。`q&#8217;命令用来退出脚本，当然也就不会再循环了。`d&#8217;和`D&#8217;命令的副作用是强制脚本进入下cycle，这使得我们可以用这两个命令来形成行与行之间的循环，如果下一循环中不满足循环的进入条件则循环中止——所以这两个命令既是进行循环的命令也是退出的命令。当然这些行前面都可以使用式样或行号作为运行命令的条件。</p>
<p>如果中间的语句没有对/regexp/修改则结果类似：</p>
<pre>
:a
...
ba
</pre>
<p>例：要将输入中#号后的所有xxx删除。</p>
<pre>
输入：
abc#efxxxghxxxxijxxx
输出：
abc#efghxij

sed &#39;:a
s/&#92;(#.*&#92;)xxx/&#92;1/  # 修改了循环标志
/#.*xxx/ba&#39;
</pre>
<p>当然这时t可以派上用场了：</p>
<pre>
sed &#39;:a; s/&#92;(#.*&#92;)xxx/&#92;1/; ta&#39;
</pre>
<p>下面是一些实例：</p>
<pre>
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;/re/b;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;/re/!b;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;s/re/&amp;/;t;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | gsed &#39;:a;s/re/&amp;/;T;ba&#39;
用以控制循环：
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;/re/ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;/re/!ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;s/re/&amp;/;ta&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;s/re/&amp;/;Ta&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;/re/b; :&#39;
</pre>
<h4>d/D控制循环</h4>
<p>用d来控制循环也是sed脚本中比较常用的技巧。d之所以能用来控制循环主要是因为它在删除完之后不会执行接下来的命令而会直接进入下一个cycle中。例：</p>
<pre>
sed &#39;d; s/^/abc/&#39; # s命令将不会被执行
</pre>
<h4>标志位控件循环</h4>
<p>在<a href="#sect1">前面</a>我们已经说过sed中进行条件判断的一些方法。这些方法除了是进入循环的条件也可以作为退出循环的条件。这里举个例子：</p>
<pre>
G;s/$/123456789/ # 循环9次
:loop
s/&#92;n$//;t break  # 退出循环
... do sth       # 进行操作
s/.$//           # 减一操作
b loop           # next
</pre>
<h4>N作为退出条件</h4>
<p>N添加下一行到当前PS。如果在最后一行时运行了N，sed通常会退出。如果在循环中使用则会退出循环。需要注意的是不同的N对最后一行的处理是不同的，一些版本在最后一行执行N时会安静的退出。而另一些版本如GNU sed将会默认显示PS的内容再退出。<br />
见下面的例子：</p>
<pre>
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;n;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;N;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;$!n;ba&#39;
echo -e &quot;abc&#92;nefg&quot; | sed &#39;:a;$!N;ba&#39;
</pre>
<p>第一个例子中sed会进入死循环。第二三个例子会正常退出。其中第二个例子会显示输入，而第三个例子的行为与sed的版本有关，GNU sed会显示输入。最后一个例子会进入死循环，前面说过在$!N可以让N在所有的sed版本中显示结果。但仍要判断使用的时机。</p>
<div>
<p>
<hr />
<a name="sect3"></a><br />
Previous:&nbsp;<a rel="previous" href="#sect2">sect2</a>,<br />
Up:&nbsp;<a rel="up" href="#Top">Top</a></p>
</div>
<h3>实例</h3>
<p>在sed中使用循环的例子相当多，这里举几例。</p>
<pre>
# “sed单行脚本”中的一个例子
# 以79个字符为宽度，将所有文本右对齐
sed -e :a -e &#39;s/^.&#92;{1,78&#92;}$/ &amp;/;ta&#39;  # 78个字符外加最后的一个空格

# 类似ed中的:2,8m$。
# d在这里有两个作用，a、清空PS。b、强制进入下一cycle。
# do while 2&lt;=linenum&lt;=8; H; end do
sed &#39;2,8{H;d}; $G&#39;
</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=17&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/28/sed-itera/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>SED单行脚本快速参考</title>
		<link>http://joeh.wordpress.com/2006/01/23/sed1line_zh-cn/</link>
		<comments>http://joeh.wordpress.com/2006/01/23/sed1line_zh-cn/#comments</comments>
		<pubDate>Mon, 23 Jan 2006 08:06:17 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/23/sed1line_zh-cn/</guid>
		<description><![CDATA[最近版本的SED ONE-LINER现在可以在sed.sourceforge.net上找到了。有多个语言版本也包括了简体中文版本。意大利语和西班牙语的翻译也正在进行中。 SED单行脚本快速参考（Unix 流编辑器） 2005年12月29日 英文标题：USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题：HANDY ONE-LINERS FOR SED (Unix stream editor) 整理：Eric Pement &#8211; 电邮：pemente[at]northpark[dot]edu 版本5.5 译者：Joe Hong &#8211; 电邮：hq00e[at]126[dot]com 在以下地址可找到本文档的最新（英文）版本： http://sed.sourceforge.net/sed1line.txt http://www.pement.org/sed/sed1line.txt 其他语言版本： 中文 &#8211; http://sed.sourceforge.net/sed1line_zh-CN.html 捷克语 &#8211; http://sed.sourceforge.net/sed1line_cz.html 荷语 &#8211; http://sed.sourceforge.net/sed1line_nl.html 法语 &#8211; http://sed.sourceforge.net/sed1line_fr.html 德语 &#8211; http://sed.sourceforge.net/sed1line_de.html 葡语 &#8211; http://sed.sourceforge.net/sed1line_pt-BR.html PS: 以前的中文版本（5.4版）可以在我以前的Blog: hq00e.blogsome.com上找到。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=16&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>最近版本的SED ONE-LINER现在可以在sed.sourceforge.net上找到了。有多个语言版本也包括了简体中文版本。意大利语和西班牙语的翻译也正在进行中。</p>
<blockquote><p>SED单行脚本快速参考（Unix 流编辑器）                       2005年12月29日</p>
<p>英文标题：USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor)<br />
原标题：HANDY ONE-LINERS FOR SED (Unix stream editor)</p>
<p>整理：Eric Pement  &#8211; 电邮：pemente[at]northpark[dot]edu         版本5.5<br />
译者：Joe Hong     &#8211; 电邮：hq00e[at]126[dot]com</p>
<p>在以下地址可找到本文档的最新（英文）版本：<br />
   http://sed.sourceforge.net/sed1line.txt<br />
   http://www.pement.org/sed/sed1line.txt</p>
<p>其他语言版本：<br />
  中文          &#8211; <a href="http://sed.sourceforge.net/sed1line_zh-CN.html">http://sed.sourceforge.net/sed1line_zh-CN.html</a><br />
  捷克语        &#8211; <a href="http://sed.sourceforge.net/sed1line_zh-CN.html">http://sed.sourceforge.net/sed1line_cz.html</a><br />
  荷语          &#8211; <a href="http://sed.sourceforge.net/sed1line_nl.html">http://sed.sourceforge.net/sed1line_nl.html</a><br />
  法语          &#8211; <a href="http://sed.sourceforge.net/sed1line_fr.html">http://sed.sourceforge.net/sed1line_fr.html</a><br />
  德语          &#8211; <a href="http://sed.sourceforge.net/sed1line_de.html">http://sed.sourceforge.net/sed1line_de.html</a><br />
  葡语          &#8211; <a href="http://sed.sourceforge.net/sed1line_pt-BR.html">http://sed.sourceforge.net/sed1line_pt-BR.html</a></p></blockquote>
<p>PS: 以前的中文版本（5.4版）可以在我以前的Blog: <a href="http://hq00e.blogsome.com">hq00e.blogsome.com</a>上找到。</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=16&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/23/sed1line_zh-cn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>Blogsome可以访问了</title>
		<link>http://joeh.wordpress.com/2006/01/22/blogsome%e5%8f%af%e4%bb%a5%e8%ae%bf%e9%97%ae%e4%ba%86/</link>
		<comments>http://joeh.wordpress.com/2006/01/22/blogsome%e5%8f%af%e4%bb%a5%e8%ae%bf%e9%97%ae%e4%ba%86/#comments</comments>
		<pubDate>Sun, 22 Jan 2006 06:30:54 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/22/blogsome%e5%8f%af%e4%bb%a5%e8%ae%bf%e9%97%ae%e4%ba%86/</guid>
		<description><![CDATA[早上收到了Blogsome的RSS，赶紧打开自己在Blogsome的Blog。果然能打开了……<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=15&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>早上收到了Blogsome的RSS，赶紧打开自己在Blogsome的Blog。果然能打开了……</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=15&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/22/blogsome%e5%8f%af%e4%bb%a5%e8%ae%bf%e9%97%ae%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>sed命令示例：`r&#8217;</title>
		<link>http://joeh.wordpress.com/2006/01/22/sed-cmd-r/</link>
		<comments>http://joeh.wordpress.com/2006/01/22/sed-cmd-r/#comments</comments>
		<pubDate>Sun, 22 Jan 2006 06:26:36 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/22/sed-cmd-r/</guid>
		<description><![CDATA[sed命令示例-`r&#39; `r&#39;命令用来读入文本。与`a&#39;的作用相似，但文本是放在独立的文件而不是放在脚本中。用`r&#39;的好处在于将数据与脚本独立，使脚本更易读并且修改数据文件更方便。 用法 这是GNU sed自带文档中对`r&#39;命令的说明： `r filename&#8217; Queue the contents of filename to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if filename cannot be read, it is treated as if it were an empty file, without any [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=14&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>sed命令示例-`r&#39;</h2>
<p>`r&#39;命令用来读入文本。与`a&#39;的作用相似，但文本是放在独立的文件而不是放在脚本中。用`r&#39;的好处在于将数据与脚本独立，使脚本更易读并且修改数据文件更方便。</p>
<h3>用法</h3>
<p>这是GNU sed自带文档中对`r&#39;命令的说明：</p>
<dl>
<dt>`r filename&#8217;
<dd>Queue the contents of filename to be read and inserted into the output stream at the end of the current cycle, or when the next input line is read. Note that if filename cannot be read, it is treated as if it were an empty file, without any error indication.
</dl>
<p>GNU对这个命令进行了扩展：</p>
<ul>
<li>接受两个地址。可以对一定的地址区间进行操作
<li>允许使用/dev/stdin作为文件名
<li>新增了一个`R&#39;命令。这个命令用法与`r&#39;一样但一次只读入一行。
</ul>
<p>另外一些需要注意的地方：</p>
<ul>
<li>文件不能读取时，则当成空文件处理不会有出错信息。
<li>r 命令之后不能再使用其他命令，因而如果后面的命令要另起一行或以`-e&#39;选项隔开。
<li>r是在当前的cycle结束后才在最后加入内容的，所以在无法在cycle中对读入的内容进行操作的。
</ul>
<h3>实例</h3>
<p>我一向认为一个例子比得上千言万语。看个例子先：现有一个网页要进行如下修改，在&lt;head&gt;中增加&lt;meta&gt;标签。在&lt;/body&gt;标签前增加版权声明的标签。我们将要在&lt;/title&gt;标签后的内容放在meta.tag中。将放在文件未尾的内容放在copyleft.tag中。里面的内容如下：</p>
<pre>
$ cat meta.tag
&lt;meta name=&quot;description&quot; content=&quot;...&quot;&gt;
&lt;meta name=&quot;keywords&quot; content=&quot;..., ... &quot;&gt;

$ cat copyleft.tag
&lt;div class=&quot;copyleft&quot;&gt;
版权所有……
&lt;/div&gt;
</pre>
<p>我们需要的命令是：</p>
<pre>
sed &#39;/&lt;&#92;/title&gt;/r meta.tag
      /&lt;&#92;/body&gt;/{
            x
            r copyleft.tag
            G}&#39;  samp.html
</pre>
<p>写成单行的形式就是：</p>
<pre>
sed -e &#39;/&lt;&#92;/title&gt;/r meta.tag&#39; -e &#39;/&lt;&#92;/body&gt;/{x;r copyleft.tag&#39; -e &#39;G}&#39;  samp.html
</pre>
<p>如果你在Windows的命令行上使用的话，那就根据你所用的版本将单引号相应的改为双引号。不过请务必注意上面脚本是一个简化的情形，因为标签也可能有大写字母<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>（虽然W3C的XHTML中要求标签必须是小写，但这种可能性是存在的视你自已的情况而定。）如果你用的是GNU sed的话那恭喜，你可以在式样后使用`I&#39;修改符（modifier）：/&lt;&#92;/title&gt;/I。否则：/&lt;&#92;/[tT][iI][tT][lL][eE]&gt;/当然偶尔可以偷懒：/&lt;&#92;/[tT].[tT].[eE]&gt;/。</p>
<h3>实例：批量修改</h3>
<p>当然我们想修改的通常不会只是一个文件，于是我们需要用到shell（注意文件的读写权限）：</p>
<pre>
$ for a in `find . -name &quot;*.html&quot;`
do
 mv $a $a.bak
 sed -e &#39;/&lt;&#92;/title&gt;/r meta.tag&#39; -e &#39;/&lt;&#92;/body&gt;/{x;r copyleft.tag&#39; -e &#39;G}&#39; $a.bak &gt;$a
done
</pre>
<p>find有一个-exec，但是如果参数太多会出错因而这里使用了for命令。<br />
如果是Windows平台：</p>
<pre>
for /R %a in (*.html) do @copy %a %a.bak &amp; @sed -e &quot;...&quot; %a.bak&gt;%a
</pre>
<p>在批处理中使用时记得要用`%%&#39;代替`%&#39;。</p>
<p>如果你用的是GNU sed 4.0或以上版本，那你可以使用-i选项代替`mv&#39;命令：</p>
<pre>
$ for a in `find . -name &quot;*.html&quot;`
do
 gsed -i.bak -e &#39;
       /&lt;&#92;/title&gt;/r meta.tag
       /&lt;&#92;/body&gt;/{
          x
          r copyleft.tag
          G}&#39; $a
done
</pre>
<div>
<hr />
<a name="texinfo-footnotes-in-document"></a><br />
<h4>Footnotes</h4>
<p>[<a name="fn-1" href="#fnd-1">1</a>] 更复杂的情形是title后的方括号也许在下面一行。</p>
<p>
<hr /></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=14&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/22/sed-cmd-r/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>无题</title>
		<link>http://joeh.wordpress.com/2006/01/21/blah2/</link>
		<comments>http://joeh.wordpress.com/2006/01/21/blah2/#comments</comments>
		<pubDate>Sat, 21 Jan 2006 15:49:37 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/21/blah2/</guid>
		<description><![CDATA[刚才在Digg上看到在有出版商提供免费的计算机书籍下载。从标题看这些书都不错的样子，建议赶紧去看一下有没有自已喜欢的书。地址是www.apress.com。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=13&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>刚才在<a href="http://www.digg.com">Digg</a>上看到在有出版商提供免费的计算机书籍下载。从标题看这些书都不错的样子，建议赶紧去看一下有没有自已喜欢的书。地址是<a href="http://www.apress.com">www.apress.com</a>。</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=13&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/21/blah2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>blah, blah&#8230;</title>
		<link>http://joeh.wordpress.com/2006/01/21/blah-blah/</link>
		<comments>http://joeh.wordpress.com/2006/01/21/blah-blah/#comments</comments>
		<pubDate>Fri, 20 Jan 2006 16:16:14 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/21/blah-blah/</guid>
		<description><![CDATA[刚才将以前在Blogsome的两篇awk的文章也帖过来了，因为访问Blogsome很不方便。对原来的内容和标题做了少量的修改。可惜的是Wordpress对上传的文件有格式限制，没法将相关的脚本文件也一起传上来。现在对Wordpress的各个方面还算满意，只是能定制的选项太少了——不能对模板也不能对CSS进行定制，还有就是上传的限制……不过总的来说很好了，现在只希望它不会很快被封了。<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=11&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>刚才将以前在Blogsome的两篇awk的文章也帖过来了，因为访问Blogsome很不方便。对原来的内容和标题做了少量的修改。可惜的是Wordpress对上传的文件有格式限制，没法将相关的脚本文件也一起传上来。现在对Wordpress的各个方面还算满意，只是能定制的选项太少了——不能对模板也不能对CSS进行定制，还有就是上传的限制……不过总的来说很好了，现在只希望它不会很快被封了。</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/11/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/11/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/11/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/11/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/11/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=11&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/21/blah-blah/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>`sedoku&#8217;能玩智力游戏的sed脚本</title>
		<link>http://joeh.wordpress.com/2006/01/18/sedoku/</link>
		<comments>http://joeh.wordpress.com/2006/01/18/sedoku/#comments</comments>
		<pubDate>Wed, 18 Jan 2006 11:58:45 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[sed]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/18/sedoku/</guid>
		<description><![CDATA[前两个礼拜E. Rosten在sed邮件列表上帖了一个很强的sed脚本——sedoku。 这个sed脚本是用来解sudoku字迷的。sudoku中玩家要根据给定的几个数字，对空格进行填充。使得每一行每一列中都有数字1到9，并且每个小正方形中的也必须有1到9（可参考下面的图）。老实说在见到这个脚本之前，我根本不知道有这种游戏。后来找了个线上sudoku用简单级玩了一下，成绩……。可以在sudoku的网站上找到更多sudoku游戏的信息（当然也可以google一下）。 `sedoku&#8217;确实是个让人开眼界的sed程序/脚本，因为大多数人都将sed的应用局限在很小的范围内——谁会想到它也可以用来解数字字迷游戏呢？建议对sed有兴趣的话一定要收藏！ 另外，sedoku脚本接收的输入要求以点“.”代替空格。所以像这样的字迷： 对应的文本格式应该为： $ cat sudoku1 .3..1.89. .1..96.5. .654..7.. 39..7.... 84.6.1.73 ....8..62 ..9..564. .8.76..1. .57.4..2. 这是运行结果： $ sed -f sedoku.sed sudoku1 234517896 718396254 965428731 396274185 842651973 571983462 129835647 483762519 657149328 [--结束--]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=8&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>前两个礼拜E. Rosten在sed邮件列表上帖了一个很强的sed脚本——<a href="http://mi.eng.cam.ac.uk/~er258/code/sed/sedoku.sed">sedoku</a>。</p>
<p>这个sed脚本是用来解sudoku字迷的。sudoku中玩家要根据给定的几个数字，对空格进行填充。使得每一行每一列中都有数字1到9，并且每个小正方形中的也必须有1到9（可参考下面的图）。老实说在见到这个脚本之前，我根本不知道有这种游戏。后来找了个线上sudoku用简单级玩了一下，成绩……。可以在<a href="http://www.sudoku-puzzles.net/">sudoku的网站</a>上找到更多sudoku游戏的信息（当然也可以google一下）。</p>
<p>`sedoku&#8217;确实是个让人开眼界的sed程序/脚本，因为大多数人都将sed的应用局限在很小的范围内——谁会想到它也可以用来解数字字迷游戏呢？建议对sed有兴趣的话一定要收藏！</p>
<p>另外，sedoku脚本接收的输入要求以点“.”代替空格。所以像这样的字迷：<br />
<img src="http://static.flickr.com/31/88171648_81386dc83b_m.jpg" alt="sudoku" /></p>
<p>对应的文本格式应该为：</p>
<pre>
$ cat sudoku1
.3..1.89.
.1..96.5.
.654..7..
39..7....
84.6.1.73
....8..62
..9..564.
.8.76..1.
.57.4..2.
</pre>
<p>这是运行结果：</p>
<pre>
$ sed -f sedoku.sed sudoku1
234517896
718396254
965428731
396274185
842651973
571983462
129835647
483762519
657149328
</pre>
<p>[--结束--]</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/8/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/8/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=8&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/18/sedoku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/31/88171648_81386dc83b_m.jpg" medium="image">
			<media:title type="html">sudoku</media:title>
		</media:content>
	</item>
		<item>
		<title>gawk转换数字为中文大写形式</title>
		<link>http://joeh.wordpress.com/2006/01/17/gawk-ch-fig/</link>
		<comments>http://joeh.wordpress.com/2006/01/17/gawk-ch-fig/#comments</comments>
		<pubDate>Tue, 17 Jan 2006 10:36:50 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[awk]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/17/gawk-ch-fig/</guid>
		<description><![CDATA[这是一个将阿拉伯数字转化为相应的中文大写形式的gawk脚本。前几天有人问起能否用awk实现数字转中文大写，于是写了这个脚本。一开始以为会挺简单的，没想到还折腾了一晚 :( 这里面用到了两个数组a和p，刚接触awk的人可以参考一下这里面数组的用法。个人认为使用数组可以大大地简化脚本。尤其是awk中对变量的类型没有严格限定，可以很容易地在数组的索引与值之间建立关联。 下面是脚本： #!/usr/bin/gawk -f # 1234567890 壹贰叁肆伍陆柒捌玖零 # 说明：单位以“亿亿”表示10的16次方，而“亿亿亿”表示 # 10的24次方，依此类推 # 自定义函数setunits()：为数字增加中文单位 # setunits(起始位，结束位，亿的个数， ...局部变量) func setunits(off1,off2,state, i,j){ for(i=off2;i&#62;=off1;i--) { if (off2-i==4) $i=$i "万" else if($i!="0") $i=$i p[(off2-i)%4] } # 每8位state就增加1，用来控制单位中“亿”的个数。 j=state; while(j--) $off2=$off2 "亿" # 退出条件 if (off1==1) return else if (off1&#60;=9) setunits(1,off1-1,++state) else setunits(off1-8,off1-1,++state) } # 自定义函数conv_num()：将数字转换为中文 # 定义局部变量i func [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=7&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>这是一个将阿拉伯数字转化为相应的中文大写形式的gawk脚本。前几天有人问起能否用awk实现数字转中文大写，于是写了这个脚本。一开始以为会挺简单的，没想到还折腾了一晚 :(</p>
<p>这里面用到了两个数组a和p，刚接触awk的人可以参考一下这里面数组的用法。个人认为使用数组可以大大地简化脚本。尤其是awk中对变量的类型没有严格限定，可以很容易地在数组的索引与值之间建立关联。</p>
<p>下面是脚本：</p>
<pre>
#!/usr/bin/gawk -f
# 1234567890 壹贰叁肆伍陆柒捌玖零
# 说明：单位以“亿亿”表示10的16次方，而“亿亿亿”表示
# 10的24次方，依此类推

# 自定义函数setunits()：为数字增加中文单位
# setunits(起始位，结束位，亿的个数， ...局部变量)
func setunits(off1,off2,state,   i,j){
	for(i=off2;i&gt;=off1;i--) {
		if (off2-i==4) $i=$i "万"
		else if($i!="0") $i=$i p[(off2-i)%4]
	   }
	# 每8位state就增加1，用来控制单位中“亿”的个数。
	j=state; while(j--) $off2=$off2 "亿"
	# 退出条件
	if (off1==1) return
	else if (off1&lt;=9) setunits(1,off1-1,++state)
	else setunits(off1-8,off1-1,++state)
}

# 自定义函数conv_num()：将数字转换为中文
# 定义局部变量i
func conv_num(  i){
	# 注意下面替换的顺序
	sub(/0*&#92;./,"点")
	# 清除连续的0
	gsub(/0000万0000[亿]+/,"")
	gsub(/0000万/,"")
	gsub(/0+亿/,"亿")
	gsub(/0+万/,"万")
	gsub(/0+/,"0")
	sub(/^[亿万]+/,"")
	#清除首尾的0
	sub(/^00*/,"")
	sub(/00*$/,"")
	sub(/^$/,"零")
        sub(/^点/,"零点")
	# 替换阿拉伯数字为中文
        for(i in a) gsub(i-1,a[i])
}

# 主程序体 -------------------------
# 设置栏位的输入和输出的分隔符为空字串
BEGIN{  FS=OFS=""
	split("拾,佰,仟,万",p,",")
	split("零,壹,贰,叁,肆,伍,陆,柒,捌,玖",a,",")
     }

{ gsub(/,/,"") } #允许输入 123,456.789 的形式

# 验证输入。这里没有对多个小数点进行验证。
/^[-0-9][0-9.]*$/{ 

	# 判断正负
	isNeg=(sub(/^-/,""))

	# 小数点前的数字进行单位设置
	if (dotpos=index($0,".")) {
		of2=dotpos-1
		for (i=of2+2;i&lt;=NF;i++) $i=a[$i+1]
	}else of2=NF
	if (of2&gt;8) setunits(of2-7,of2,0)
	else setunits(1,of2,0)

	# 阿拉伯数字转为中文数字
	conv_num()

	# 还原正负号
	if (isNeg &amp;&amp; $0!="零") print "负" $0
	else print
	}

# 程序结束 -------------------------
</pre>
<p>将上面的脚本保存为&#8221;chfig.awk&#8221;（当然你可以随意地命名）。这是运行结果：</p>
<pre>
hq00e@somewhere ~
$ echo 98.76543210|gawk -f chfig.awk
玖拾捌点柒陆伍肆叁贰壹零

hq00e@somewhere ~
$ echo -10000234000.060|gawk -f chfig.awk
负壹佰亿零贰拾叁万肆仟点零陆零
</pre>
<p>[--结束--]</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/7/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/7/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=7&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/17/gawk-ch-fig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
		<item>
		<title>gawk进行字母加总</title>
		<link>http://joeh.wordpress.com/2006/01/17/sum-up-alpha/</link>
		<comments>http://joeh.wordpress.com/2006/01/17/sum-up-alpha/#comments</comments>
		<pubDate>Tue, 17 Jan 2006 06:36:47 +0000</pubDate>
		<dc:creator>hq00e</dc:creator>
				<category><![CDATA[awk]]></category>

		<guid isPermaLink="false">http://joeh.wordpress.com/2006/01/17/sum-up-alpha/</guid>
		<description><![CDATA[Table of Contents 字母加总 任务分析 计算总和的脚本 另一种实现方法 显示特定总和值单词/词组的脚本。 Up:&#160;(dir) 字母加总 awk中的关联数组十分灵活方便。这一篇中将会涉及关联数组的用法。 &#8211;by hq00e 曾经看过这样的一个签名档： 如果将英语的26个字母由A到Z分别编上1到26的分数， 你的知识(KNOWLEDGE)只能得到11+14+15+23+12+5+4+7+5=96分。 你努力工作(HARDWORK)也只能得到8+1+18+4+23+15+18+11=98分。 只有你的态度(ATTITUDE)才是左右你生命全部的1+20+20+9+20+21+4+5=100分。 想知道还有哪些单词的总和是100吗？这知道答案很容易，只要你会用awk。所以这一次我们要写一个脚本来计算英文单词字母的总和。如果有字典文件还可以找出和为特定值的所有单词和词组。 Next:&#160;计算总和的脚本, Up:&#160;Top 任务分析 根据前面引用的签名档，字母A到Z将分别由数字1到26来表示——A=1,B=2,&#8230;,Z=26。不分大小写所以A=a=1。 首先，要对字母进行编号。方法有很多种，这里我们会使用awk中常用的技巧来完成编号。 其次，读入字母，并根据相应的编号进行加总。 只要两步——看来是个简单任务！现在开始想一想具体怎么用awk实现？或者（如果你对awk不是很熟的话）用其他编程语言怎么实现？ Next:&#160;另一种实现方法, Previous:&#160;任务分析, Up:&#160;Top 计算总和的脚本 首先，对字母编号。awk中为数组元素分配多个值常用的方法是用`split(STRING, ARRAY [, FIELDSEP])&#8217;函数。它的返回值是数组元互素的个数。需要注意的是：数组的下标是从`1&#8242;，而不是从`0&#8242;开始的。 n=split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",alpha,"") 这条语句会生成alpha数组，内容如下：alpha[1]="A";alpha[2]="B";...;alpha[26]="Z"。但我们需要的是以字母为索引找到对应的数值，而不是相反。所以还要进一步加工： while(n) { num_alpha[alpha[n]]=n; n--} 现在得到了一个关联数组num_alpha[]。内容如下： num_alpha["A"]=1 num_alpha["B"]=2 ... num_alpha["Z"]=3 现在只要以输入的字母为索引就能得到对应的数值了。假设输入&#8221;ADD&#8221;，只要分别以“A”、“D”、“D”为索引加总： num_alpha["A"] + num_alpha["D"] + num_alpha["D"] = 1 + 4 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=5&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div>
<h2>Table of Contents</h2>
<ul>
<li><a name="toc_Top" href="#Top-sum">字母加总</a>
<ul>
<li><a href="#g_t_00c8_00ce_00ce_00f1_00b7_00d6_00ce_00f6">任务分析</a>
<li><a href="#g_t_00bc_00c6_00cb_00e3_00d7_00dc_00ba_00cd_00b5_00c4_00bd_00c5_00b1_00be">计算总和的脚本</a>
<li><a href="#g_t_00c1_00ed_00d2_00bb_00d6_00d6_00ca_00b5_00cf_00d6_00b7_00bd_00b7_00a8">另一种实现方法</a>
<li><a href="#g_t_00cf_00d4_00ca_00be_00cc_00d8_00b6_00a8_00d7_00dc_00ba_00cd_00b5_00c4_00b5_00a5_00b4_00ca">显示特定总和值单词/词组的脚本。</a>
</li>
</ul>
</li>
</ul>
</div>
<div>
<p>
<hr />
<a name="Top-sum"></a><br />
Up:&nbsp;<a rel="up" href="#dir">(dir)</a></p>
</div>
<h2>字母加总</h2>
<blockquote><p>
awk中的关联数组十分灵活方便。这一篇中将会涉及关联数组的用法。<br />
<br />&ndash;by hq00e</p>
</blockquote>
<p>曾经看过这样的一个签名档：</p>
<blockquote><p>
如果将英语的26个字母由A到Z分别编上1到26的分数，<br />
你的知识(KNOWLEDGE)只能得到11+14+15+23+12+5+4+7+5=96分。<br />
你努力工作(HARDWORK)也只能得到8+1+18+4+23+15+18+11=98分。<br />
只有你的态度(ATTITUDE)才是左右你生命全部的1+20+20+9+20+21+4+5=100分。
</p></blockquote>
<p>   想知道还有哪些单词的总和是100吗？这知道答案很容易，只要你会用awk。所以这一次我们要写一个脚本来计算英文单词字母的总和。如果有字典文件还可以找出和为特定值的所有单词和词组。</p>
<div>
<p>
<hr />
<a name="%c8%ce%ce%f1%b7%d6%ce%f6"></a><br />
<a name="g_t_00c8_00ce_00ce_00f1_00b7_00d6_00ce_00f6"></a><br />
Next:&nbsp;<a rel="next" href="#g_t_00bc_00c6_00cb_00e3_00d7_00dc_00ba_00cd_00b5_00c4_00bd_00c5_00b1_00be">计算总和的脚本</a>,<br />
Up:&nbsp;<a rel="up" href="#Top-sum">Top</a></p>
</div>
<h3>任务分析</h3>
<p>根据前面引用的签名档，字母A到Z将分别由数字1到26来表示——A=1,B=2,&#8230;,Z=26。不分大小写所以A=a=1。</p>
<ul>
<li>首先，要对字母进行编号。方法有很多种，这里我们会使用awk中常用的技巧来完成编号。
<li>其次，读入字母，并根据相应的编号进行加总。
</ul>
<p>   只要两步——看来是个简单任务！现在开始想一想具体怎么用awk实现？或者（如果你对awk不是很熟的话）用其他编程语言怎么实现？</p>
<div>
<p>
<hr />
<a name="%bc%c6%cb%e3%d7%dc%ba%cd%b5%c4%bd%c5%b1%be"></a><br />
<a name="g_t_00bc_00c6_00cb_00e3_00d7_00dc_00ba_00cd_00b5_00c4_00bd_00c5_00b1_00be"></a><br />
Next:&nbsp;<a rel="next" href="#g_t_00c1_00ed_00d2_00bb_00d6_00d6_00ca_00b5_00cf_00d6_00b7_00bd_00b7_00a8">另一种实现方法</a>,<br />
Previous:&nbsp;<a rel="previous" href="#g_t_00c8_00ce_00ce_00f1_00b7_00d6_00ce_00f6">任务分析</a>,<br />
Up:&nbsp;<a rel="up" href="#Top-sum">Top</a></p>
</div>
<h3>计算总和的脚本</h3>
<p>首先，对字母编号。awk中为数组元素分配多个值常用的方法是用`split(STRING, ARRAY [, FIELDSEP])&#8217;函数。它的返回值是数组元互素的个数。需要注意的是：数组的下标是从`1&#8242;，而不是从`0&#8242;开始的。</p>
<pre>
	n=split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",alpha,"")
</pre>
<p>这条语句会生成alpha数组，内容如下：<tt>alpha[1]="A";alpha[2]="B";...;alpha[26]="Z"</tt>。但我们需要的是以字母为索引找到对应的数值，而不是相反。所以还要进一步加工：</p>
<pre>
	while(n) { num_alpha[alpha[n]]=n; n--}
</pre>
<p>现在得到了一个关联数组num_alpha[]。内容如下：</p>
<pre>
num_alpha["A"]=1
num_alpha["B"]=2
...
num_alpha["Z"]=3
</pre>
<p>现在只要以输入的字母为索引就能得到对应的数值了。假设输入&#8221;ADD&#8221;，只要分别以“A”、“D”、“D”为索引加总：</p>
<pre>
  num_alpha["A"] + num_alpha["D"] + num_alpha["D"]
=       1        +      4         +       4
=       9
</pre>
<p>加总的脚本如下：</p>
<pre>
     {
       # 每读入一条记录时，先将总和归0
       sum=0
       # 将所有栏位的字母加总。非字母字符将被忽略，
       # 因为我们并未为非字母字符同值
       # 注意：这里用了toupper()。在gawk中还可以设置
       # IGNORECASE使之不区分大小写。
       for (i=1;i&lt;=NF;i++) sum+=num_alpha[toupper($i)]
       # 输出计算结果
       print sum
     }
</pre>
<p>上面的脚本中并未对输入进行限定。如果输入含有非字母字符，脚本仅是忽略它们——因为在数组中没有相应的索引，所以不会对运算结果造成影响。但你可能希望对结果进行限定，使得只有当输入中只含字母和空格（词组）时才进行加总。为此我们可以用正则表达式对输入做简单的筛选：`/^[a-zA-Z ]+$/&#8217;<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>。注意后面的空格。<br />
具体实现如下：</p>
<pre>
gawk 'BEGIN{
   FS=""
   # split()的最后一个参数可省略，因为和FS是一样的
   n=split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",alpha,"")
   while(n) { num_alpha[alpha[n]]=n; n-- }
  }
/^[a-zA-Z ]+$/{
   sum=0
   for (i=1;i&lt;=NF;i++) sum+=num_alpha[toupper($i)]
   print sum
      }'
</pre>
<div>
<p>
<hr />
<a name="%c1%ed%d2%bb%d6%d6%ca%b5%cf%d6%b7%bd%b7%a8"></a><br />
<a name="g_t_00c1_00ed_00d2_00bb_00d6_00d6_00ca_00b5_00cf_00d6_00b7_00bd_00b7_00a8"></a><br />
Next:&nbsp;<a rel="next" href="#g_t_00cf_00d4_00ca_00be_00cc_00d8_00b6_00a8_00d7_00dc_00ba_00cd_00b5_00c4_00b5_00a5_00b4_00ca">显示特定总和的单词</a>,<br />
Previous:&nbsp;<a rel="previous" href="#g_t_00bc_00c6_00cb_00e3_00d7_00dc_00ba_00cd_00b5_00c4_00bd_00c5_00b1_00be">计算总和的脚本</a>,<br />
Up:&nbsp;<a rel="up" href="#Top-sum">Top</a></p>
</div>
<h3>另一种实现方法</h3>
<p>不过我们还可以将这个脚本写得更紧凑一点，我们需要有一种不同的思路。上一个脚本，我们预先计算每个字母对应的数值，但我们其实可以边加总边计算，即省略了数组这一中间过程。awk提供了一个函数`index(IN, FIND)&#8217;，用来返回`FIND&#8217;在`IN&#8217;中的位置。而“ABCD&#8230;Z”中字母的位置与各自的编号是一致的，因而可以以输入的字母为索引通过`index()&#8217;来实时计算总和。</p>
<pre>
gawk -vFS="" '{
    # 将FS设为空字串，这样每个字母都会被视为一个栏位。
   sum=0                  # 每读入一条记录时将sum置0
   for(i=1;i&lt;=NF;i++)  # 将所有栏位相加
     sum+=index("ABCDEFGHIJKLMNOPQRSTUVWXYZ",toupper($i))
   print sum
 }'
</pre>
<p>下面是一些运行结果：</p>
<pre>
$ echo fortune|gawk -vFS="" '{sum=0;for(i=1;i&lt;=NF;i++)sum+=index("ABCDEFGHIJKLM
NOPQRSTUVWXYZ",toupper($i));print sum}'
99
</pre>
<p>财富的确是很重要，看来比爱重要很多——用“love”运行的结果是“54”。不过建议试一下“love and care”——光有爱是不行的还要懂得关怀！</p>
<div>
<p>
<hr />
<a name="%cf%d4%ca%be%cc%d8%b6%a8%d7%dc%ba%cd%b5%c4%b5%a5%b4%ca"></a><br />
<a name="g_t_00cf_00d4_00ca_00be_00cc_00d8_00b6_00a8_00d7_00dc_00ba_00cd_00b5_00c4_00b5_00a5_00b4_00ca"></a><br />
Previous:&nbsp;<a rel="previous" href="#g_t_00c1_00ed_00d2_00bb_00d6_00d6_00ca_00b5_00cf_00d6_00b7_00bd_00b7_00a8">另一种实现方法</a>,<br />
Up:&nbsp;<a rel="up" href="#Top-sum">Top</a></p>
</div>
<h3>显示特定总和值单词/词组的脚本。</h3>
<p>如果你有看上一篇并有找到合适的英汉字典的话，我们还可以让gawk替我们找出所有和为特定值的单词或短语。为此需要增加一条判断语句：</p>
<pre>
gawk -vFS="" '{        # 将FS设为空字串，这样每个字母都会被视为一个栏位。
   sum=0               # 每读入一条记录时将sum置0
   for(i=1;i&lt;=NF;i++)  # 将所有栏位相加
     sum+=index("ABCDEFGHIJKLMNOPQRSTUVWXYZ",toupper($i))
   # 总和为100的话则输出当前记录（$0），当然你也可以改成其他值
   if (sum==100) print
 }'
</pre>
<p>当然我们还需要有字典文件，对我们之前用过的字典文件dict.txt<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a>进行加工：<br />
`cut -f1 dict.txt &gt;voca.txt&#8217;<br />
如果用的是Windows的话，你可能没有cut工具，那就用awk：</p>
<pre>
gawk -v FS="\t" "{print $1}" dict.txt &gt;voca.txt
</pre>
<p>运行前面的脚本：</p>
<pre>
gawk -vFS="" '{...省略...}' voca.txt
</pre>
<p>这是脚本在Windows下的运行结果<a rel="footnote" href="#fn-3" name="fnd-3"><sup>3</sup></a>：</p>
<pre>
e:\&gt; gawk -vFS="" "{sum=0;for(i=1;i&lt;=NF;i++)sum+=index(\"ABCDEFGHIJKLMNOPQRSTUVW
XYZ\",toupper($i));if(sum==100)print}" voca.txt
...省略
American oil
Anchicodium
Anglophobia
Anthozoa
Astralon
AutoMark
Avernus
Bar Draught
Bear steady!
Berlin blue
Bingham body
Bombay hemp
Bouma cycle
Butoxide
C battery cab
Carbolan dye
...省略
</pre>
<p>当然如果你不想输入那么长的脚本的话，可以将它放到单独的脚本文件中。</p>
<p>[&ndash;结束&ndash;]</p>
<div>
<hr />
<a name="texinfo-footnotes-in-document"></a><br />
<h4>Footnotes</h4>
<p>[<a name="fn-1" href="#fnd-1">1</a>] 也可以使用字母类[[:alpha:]]</p>
<p>[<a name="fn-2" href="#fnd-2">2</a>] 见“gawk显示指定内容”</p>
<p>[<a name="fn-3" href="#fnd-3">3</a>] 看来总和为100的单词和词组还真不少。用我的字典，删除重复项后，共有3177条条目总和为100</p>
<p>
<hr /></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/joeh.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/joeh.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/joeh.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/joeh.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/joeh.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/joeh.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/joeh.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/joeh.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/joeh.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/joeh.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=joeh.wordpress.com&amp;blog=70570&amp;post=5&amp;subd=joeh&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://joeh.wordpress.com/2006/01/17/sum-up-alpha/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/94ee3bdc49a14f00ef92e83e230ccf21?s=96&#38;d=identicon" medium="image">
			<media:title type="html">joeh</media:title>
		</media:content>
	</item>
	</channel>
</rss>
