开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
前言
在这章中,我们继续着手于文本相关的工具,关注那些用来格式化输出的程序,而不是改变文本自身。这些工具通常让文本准备就绪打印,这是我们在下一章会提到的。
我们在这章中会提到的工具有:
-
nl –添加行号
-
fold –限制文件列宽
-
fmt –一个简单的文本格式转换器
-
pr –让文本为打印做好准备
-
printf –格式化数据并打印出来
-
groffff –一个文件格式系统
我们将先着眼于一些简单的格式工具。他们都是功能单一的程序,并且做法有一点单纯,
但是他们能被用于小任务并且作为脚本和管道的一部分。
一、格式化输出
1.1 nl
– 添加行号
nl 程序是一个相当神秘的工具,用作一个简单的任务。它添加文件的行数。在它最简单的用途中,它相当于 cat -n:
[me@linuxbox ~]$ nl distros.txt | head
像 cat,nl 既能接受多个文件作为命令行参数,也能标准输出。然而,nl 有一个相当数量的选项并支持一个简单的标记方式去允许更多复杂的方式的计算。
nl 在计算文件行数的时候支持一个叫“逻辑页面”的概念。这允许 nl 在计算的时候去重设(再一次开始)可数的序列。用到那些选项的时候,可以设置一个特殊的开始值,并且在某个可限定的程度上还能设置它的格式。一个逻辑页面被进一步分为 header, body 和 footer 这样的元素。在每一个部分中,数行数可以被重设,并且/或被设置成另外一个格式。如果 nl 同时处理多个文件,它会把他们当成一个单一的文本流。文本流中的部分被一些相当古怪的标记的存在加进了文本:
每一个上述的标记元素肯定在自己的行中独自出现。在处理完一个标记元素之后,nl 把它从文本流中删除。
这里有一些常用的 nl 选项:
坦诚的说,我们大概不会那么频繁地去数行数,但是我们能用 nl 去查看我们怎么将多个工具结合在一个去完成更复杂的任务。我们将在之前章节的基础上做一个 Linux 发行版的报告。
因为我们将使用 nl,包含它的 header/body/footer 标记将会十分有用。
我们将把它加到上一章的 sed 脚本来做这个。使用我们的文本编辑器,我们将脚本改成一下并且把它保存成distros-nl.sed:
# sed script to produce Linux distributions report
1 i\
\\:\\:\\:\
\
Linux Distributions Report\
\
Name
Ver. Released\
----
---- --------\
\\:\\:
s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/
$ i\
\\:\
\
End Of Report
这个脚本现在加入了 nl 的逻辑页面标记并且在报告的最后加了一个 footer。记得我们在我们的标记中必须两次使用反斜杠,因为他们通常被 sed 解释成一个转义字符。
fold
–限制文件列宽
折叠是将文本的行限制到特定的宽的过程。像我们的其他命令,fold 接受一个或多个文件及标准输入。
fmt
– 一个简单的文本格式器
fmt 程序同样折叠文本,外加很多功能它接受文本或标准输入并且在文本流上呈现照片转换。基础来说,他填补并且将文本粘帖在一起并且保留了空白符和缩进。
为了解释,我们将需要一些文本。让我们抄一些 fmt 主页上的东西吧:
我们将把这段文本复制进我们的文本编辑器并且保存文件名为 fmt-info.txt。现在,让我们重新格式这个文本并且让它成为一个 50 个字符宽的项目。我们能用 -w 选项对文件进行处理:
[me@linuxbox ~]$ fmt -w 50 fmt-info.txt | head
'fmt' reads from the specified FILE arguments
(or standard input if
none are given), and writes to standard output.
By default, blank lines, spaces between words,
and indentation are
preserved in the output; successive input lines
with different indentation are not joined; tabs
are expanded on input and introduced on output.
默认来说,空白行,单词间距,还有缩进都会在输出中保留;持续输入不同的缩进的流不会被结合;tabs 被用来扩展输入并且引入输出。