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

代码:

 1 #!/bin/sh2 3 # fmt的一个使用norff命令的版本。增加2个有用的选项: 4 # 行宽度:-w X 5 # 启用连字符:-h6 7 while getopts "hw:" opt; do8     case $opt in9       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 

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

转载于:https://www.cnblogs.com/lalala23456/archive/2012/12/14/2817549.html

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

  1. Web前端开发笔记——第二章 HTML语言 第三节 文本格式化标签

    目录 前言 一.文本加粗.斜体标签 二.文本字体缩小.放大标签 三.文本下标.上标标签 四.文本下划线.删除线标签 五.双引号字符 结语 前言 这里主要介绍对html语言中对文本的处理. 一.文本加粗 ...

  2. [云炬创业学笔记]第二章决定成为创业者测试14

  3. 【数据库原理及应用】经典题库附答案(14章全)——第二章:关系数据库知识

    [数据库原理及应用]经典题库附答案(14章全)--第一章:数据库基础知识 [数据库原理及应用]经典题库附答案(14章全)--第二章:关系数据库知识 [数据库原理及应用]经典题库附答案(14章全)--第 ...

  4. 《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

    C++ Primer第二章的内容主要介绍了变量和基础类型,包括C++语言定义的基础内置类型.变量的定义及声明.符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍,本次博客也从这 ...

  5. (转)MVS-OS390系统管理-第二章 大型服务器外存管理

    http://zmdxyboyandy.blog.bokee.net/bloggermodule/blog_viewblog.do?id=205821 更多文章首页 > 文章 > IBM大 ...

  6. 计算机文化基础第二章,计算机文化基础(第二章Windows2000操作系统)

    计算机文化基础(第二章Windows2000操作系统) 第二章Windows 2000 操作系统1. 打开"资源管理器"的方法不能是_A右击"开始"按钮 B选择 ...

  7. [转载]Programming MS Office 2000 Web Components第二章第三节

    第二章第三节 编程模型要点 现在总结一下我们对电子表格组件的介绍,我将讲述(电子表格)控件编程模型的各个要点,以便您了解如何运用这个控件,以及当您需要编写脚本来实现不同的功能时该如何去做.本节不是编程 ...

  8. 计算机第二章基础知识习题,计算机基础知识习题.docx

    文档介绍: 第一章计算机基础知识****题一.单项选择题2.最先实现存储程序的计算机是B.A.ENIACB.EDSACC.EDVACD.VNIVA4.开机时显示如下出错信息的含义是B.Non-syst ...

  9. 第二章:python必备基础语法

    文章目录 第二章 python必备基础语法 一.变量 1.1 什么是变量?有什么用处? 1.2 如何声明一个变量(即定义变量)? 1.3 变量的命名规则及风格 1.4 变量值的三大特性 作业: 1.5 ...

  10. 第二章 VB的界面设计

    轉自:http://wwww.hyit.edu.cn/edu/vb/study/index.htm 第二章         VB的界面设计 2.1  VB用户界面设计基础 1. 概述 界面的设计有两步 ...

最新文章

  1. CCNA的一个综合实验(经典)
  2. datastage服务器项目nls安装,datastage 安装
  3. BZOJ4516: [Sdoi2016]生成魔咒
  4. [转载] java提取字符串中的字母数字
  5. 在spring中使用JdbcTemplate进行数据库管理操作
  6. 蓝桥杯 ALGO-148 算法训练 5-1最小公倍数
  7. 目录_计算机视觉——算法及应用
  8. Hex2Bin使用方法
  9. ubuntu18.0.4 无线网卡无法上网解决!
  10. java程序设计大赛_2016年“小码哥杯”Java程序设计竞赛完美收官
  11. 基于埋点日志数据的网络流量统计(网站独立访客数(UV)的统计)
  12. 雷军:别轻易尝试,要做好准备再去创业
  13. Android实现抽奖转盘
  14. Educoder -Java面向对象-Java语言之数组(第1关:数组的遍历:给小朋友分糖果)
  15. .net core webAPI 使其同时支持返回json或xml
  16. ubuntu下远程访问服务器的方法
  17. 获取移动端ip的方法
  18. Basic4IOS (B4I) New Version Crack
  19. MySQLdb ImportError: libmysqlclient.so.18 No Such File or Directory
  20. UE4移动组件详解(三)——RootMotion与特殊移动模式的实现思路

热门文章

  1. 零基础入门实践目标检测项目
  2. 操作系统 关于死锁的面试题
  3. android把2变成02_【Android】学习札记第2章之数组二(Arrays工具类)
  4. C++ boost multiprecision类型转换 u256转double
  5. C++ 构造函数后面有冒号 ~ : ()
  6. 以太坊源代码 - eth_call以及eth_sendTransaction区别
  7. FISCO BCOS源码(3)线程交互和交易的生命周期
  8. kubernetes视频教程笔记 (11)-pod容器生命周期、Init容器
  9. thinkphp sql查询条件 一个字段多个限制条件
  10. java提前多久显示,Java当前日期/时间比原始时间提前1小时显示