如果登录到恰巧没有 "tac" 命令的 freebsd 系统,将发现该 sed 脚本很有用.虽然方便,但最好还是知道该脚本为什么那样做.让我们对它进行讨论.
【程序编程相关:iptables 中文手册】反转解释 【推荐阅读:学习嵌入式Linux的笔记和体会】
当对上面的文本文件执行反转脚本时,首先执行的命令是 h.该命令告诉 sed 将模式空间(保存正在处理的当前行的缓冲区)的内容复制到保留空间(临时缓冲区).然后,执行 d 命令,该命令从模式空间中删除 "foo",以便在对这一行执行完所有命令之后不打印它. 【扩展信息:清除CISCO路由器密码】
首先,该脚本包含三个由分号隔开的单独 sed 命令:1!g.h 与 $!d.现在,需要好好理解用于第一个与第三个命令的地址.如果第一个命令是 1g,则 g 命令将只应用第一行.然而,还有一个 ! 字符 -- 该 ! 字符 忽略该地址,即,g 命令将应用到除第一行之外的 所有行.$!d 命令与之类似.如果命令是 $d,则将只把 d 命令应用到文件中的最后一行($ 地址是指定最后一行的简单方式).然而,有了 ! 之后,$!d 将把 d 命令应用到除最后一行之外的 所有行.现在,我们所要理解的是这些命令本身做什么.现在,第二行.在将 "bar" 读入模式空间之后,执行 g 命令,该命令将保留空间的内容 ("foo\n") 附加到模式空间 ("bar\n"),使模式空间的内容为 "bar\n\foo\n".h 命令将该内容放回保留空间保护起来,然后,d 从模式空间删除该行,以便不打印它.
对于最后的 "oni" 行,除了不删除模式空间的内容(由于 d 之前的 $!)以及将模式空间的内容(三行)打印到标准输出之外,重复同样的步骤.
现在,要用 sed 执行一些强大的数据转换.
sed qif 魔法
过去几个星期,我一直想买一份 quicken来结算我的银行帐户.quicken 是一个非常好的金融程序,当然会成功地完成这项工作.但是,经过考虑之后,我觉得自己可以轻易编写某个软件来结算我的支票簿.我想,毕竟,我是个软件开发人员!我开发了一个很好的小型支票簿结算程序(使用 awk),它通过分析包含我的所有交易的文本文件的语法来计算余额.略微调整之后,我将其改进,以便可以象 quicken 那样跟踪不同的贷款与借款类别.但是,我还要添加一个特性.最近,我将帐户转移到一家有联机 web 帐户界面的银行.有一天,我注意到,这家银行的 web 站点允许以 quicken 的 .qif 格式下载我的帐户信息.我马上觉得,如果可以将该信息转换成文本格式,那就太棒了.
两种格式的故事
在查看 qif 格式之前,先看一下我的 checkbook.txt 格式: 28 aug 2000 food - - y supermarket 30.94 25 aug 2000 watr - 103 y check 103 52.86在我的文件中,所有字段都由一个或多个制表符分开,每个交易占据一行.... 下一页