第二章:Improving On User Commands--14.格式化长句

   如果你运气不错,你的Unix系统中已经含有了fmt命令(man下试试),它是一个对于处理文本很有用的命令。从重格式化Email到在文档中填充段落(即保证每一行上要有足够多的的词)。fmt命令对于这些都很有用。但部分Unix系统并没有包含fmt命令,特别是大学里面捐赠的系统,它们一般只有很简陋的版本。最终,我们可以在一个小脚本中使用nroff命令来达到相同的效果。nroff命令是从Unix系统诞生以来就有的一个命令。

代码:

 1 #!/bin/sh
 2 
 3 # fmt的一个使用norff命令的版本。增加2个有用的选项: 
 4 # 行宽度:-w X 
 5 # 启用连字符:-h
 6 
 7 while getopts "hw:" opt; do
 8     case $opt in
 9       h)hyph=1;;
10       w)width="$OPTARG";;
11     esac
12 done
13 shift $(($OPTIND-1))
14 
15 nroff<<EOF
16 .ll ${width:-72}
17 .na
18 .hy ${hyph:-0}
19 .pl 1
20 $(cat "$@")
21 EOF
22 
23 exit 0

脚本如何工作:
这个简洁的脚本提供了2个不同的命令选项,-w X 用来提供一行应该最多提供X个字符(默认值是72个),-h是用来启用连字符的。注意测试起始选项的地方:一个使用getopts的while循环,然后使用shift $(($OPTIND-1))来丢弃所有已经处理过的选项参数。另外,这儿更重要的一项技术可能就是here document方法了,它用来从命令行做一个多行输入。古怪的双输入重定向符号序列 nroff<<EOF 让你轻松的使用here document,这部分的代码就好像是从命令行上输入的一样。使用here document 脚本输出所有必要的nroff命令,然后调用cat来显示。cat命令的输入接着直接提供给nroff。这是一项会时常出现在本书脚本中的技术,同样也是一项值得实验的技术!

运行脚本:
这个脚本可以被包含在一个管道中,也可以在命令行上直接给出文件名。但最常用的还是作为一个外部管道的一部分,一般是由由编辑器调用,比如vi、vim等。

运行结果:

1 ./fmt.sh -h -w 50 testLibrary.sh 
2 
3 ./fmt.sh testLibrary.sh 

大家可以自己拿一个纯英文的文本文件试试。

posted @ 2012-12-14 10:06  十舍七匹狼  阅读(131)  评论(0编辑  收藏  举报