本章继续讨论与文本相关的工具,重点讲一些用于格式化文本输出而非改变文本自身内容的命令。这些命令通常用于文本的打印,而“打印”这一主题将在下一章介绍。本章将要讨论的命令如下所示。
- nl:对行进行标号。
- fold:设定文本行长度。
- fmt:简单的文本格式化工具。
- pr:格式化打印文本。
- printf:格式化并打印数据。
- grof:文档格式化系统。
1 简单的格式化工具
- nl——对行进行标号
nl 命令是一个非常神秘的工具,用于完成一个非常简单的任务:对行进行编号。就其最简单用法,与cat –n很相似。
和cat命令一样,nl既支持多个文件名作为命令行参数,也支持标准输入。然而,nl可以进行多种复杂的编号,因为它有许多参数选项,且支持原始形式的标记。
nl 进行标号时支持一个叫做逻辑页的概念,所以它可以重置(重新开始)数值序列。通过合理运用参数选项,nl 可以设置起始编号为特定的值,并在有限的范围内设置其格式。逻辑页可以进一步分解为逻辑页标题、正文和页脚。在每一个部分中,行号都可以重置并/或分配不同的风格。如果nl的输入参数是多个文件,那么nl会把它们当作一个文本流整体。文本流中的每一个部分都由一些看起来非常奇怪的标记来区别,表21-1列出了部分标记。
表21-1 中的每一个标记元素在一行中只允许出现一次。每次处理完一个标记元素后,nl便将其从文本流中删除。
表21-2列出了nl的常用选项。
- fold——将文本中的行长度设定为指定长度
fold是一个将文本行以指定长度分解的操作。与其他命令类似,fold支持一个或多个文本文件或是标准输入作为输入参数。向fold输入一个简单的文本流,便可了解其工作方式。
这样,我们便能明白fold到底完成了什么操作。echo命令输出的文本被指定了-w选项的fold分解成了片段。本例中,指定了行的宽度为12个字符。如果没有指定行宽,则默认是80个字符宽。请注意,fold在断行时并不会考虑单词边界。而增加-s选项,可使fold在到达width字符数前的最后一个有效空格处将原文本行断开,示例如下。
- fmt——简单的文本格式化工具
fmt命令同样会折叠文本,另外还包括更多其他功能。它既可以处理文件也可以处理标准输入,并对文本流进行段落格式化。就其基本功能而言,它可以在保留空白行和缩进的同时对文本行进行填充和连接。
这个输出结果还真是奇怪。也许,实际上我们应该认真地阅读一遍下面的文字,因为它解释了事情发生的原委。
默认情况下,空白行、单词之间的空格和缩进都保留在输出结果中;不同缩进量的连续输入行并不进行拼接;制表符会在输入中扩展并直接输出。
所以,fmt保留了第一行的缩进。幸运的是,fmt提供了一个参数选项以修正这一问题。
这样一来,输出结果看起来顺眼了很多。由此可见,通过增加-c选项,我们便得到了理想输出结果。
- pr——格式化打印文本
Pr命令用于给文本标页码。打印文本时,通常希望将输出内容分成几页,并且每页的顶部和底部都留出几行空白行,这些空白行可以用于插入页眉和页脚。
- printf——格式化并打印数据
与本章中涉及的其他命令不一样,printf命令并不适用于管道传输(也就是说它不支持标准输入),而且在命令行应用中它也不常见(多应用于脚本文件)。那么它到底为什么会这么重要?因为它有如此广泛的应用范围。
printf(短语print formatted的缩写)起初是为C语言开发的,后来许多编程语言也都实现了这一功能,也包括shell环境。事实上,在bash中,printf是内置的。
printf的用法如下。
printf“format”arguments
该命令行给出了一个包含格式说明的字符串,然后将该格式应用于arguments所代表的输入内容,最后格式化结果送至标准输出。如下就是一个简单例子。
该格式化字符串可以包含文字文本(如“I formatted the string”)、转义字符(如n,即换行符)以及以%开头的表示转换规格的字符序列。上例中,转换规格%s用于格式化字符串foo并将其结果输出。再看下面一个例子。
以上可以看出,%s所代表的转换规格被字符串foo取代。s表示格式化字符串数据,其他类型的数据则用其他指定字符表示。表21-4列出了常用的数据类型。
表21-6列出了一些不同格式化实例。
同样,printf通常用于脚本文件的表格数据格式化操作,而并不会直接应用于命令行。不过,我们仍然可以用其解决各种各样的格式化问题。首先,我们可以利用printf输出一些由制表符隔开的字段。