1. 命令作用
nl命令允许可以把文本内容打印出来,同时可以给内容加上行号,相比cat命令,你可以控制行号的很多细节(比如对齐方式,显示字符宽度等),同时nl命令可以让你通过几个标号定义逻辑页,可以作为文本的格式化输出工具。
2. 命令格式
1 | nl [options]... [file]... |
当没有给出文件名称,或者使用-作为文件名称的时候,则nl显示标准输入的内容。
3. 原理解释
nl命令把所有的文件内容看作一整个文档显示,根据分隔标记,把整个文档标记成页的不同部分,即header,body,footer。
header的分隔符是“:::”,body分割符“::”,footer的分割符是“:”,如果组成footer分割符的两个字符分别是ab的话,那么header的分割符就是ababab,body的就是abab。
分割符独占一行,即紧跟着每一种分割符的内容被认为是对应的页的部分,直到遇到其他分割符。例如一个文本的内容如下:
1 | aaa |
- bbb属于header
- ccc 123属于body
- ddd属于footer
第一个分隔符之前的内容也属于body,即aaa是body部分。当然header,body,footer可以在不同文件中。nl在显示文本的时候,会把分隔符替换为空行,默认只会对body添加行号。
4. 选项
4.1. -b或 --body-numbering-style
指定body部分的行号添加策略,style有如下几个选择:
- a:为所有行添加行号
- b:只为非空行添加行号,body默认是这个
- n:不添加行号
类似的,也可以指定header和footer的行号策略,选项分别如下:
- -f style 或 --footer-numbering=style 指定footer的行号策略;
- -h style 或 --header-numbering=style 指定header的行号策略
4.2. -d cd或 --section-delimiter=cd
这个选项指定分隔符,注意cd是两个字符,这样的话,cdcdcd后面的部分是header,cdcd后面的部分是body,cd后面的部分是footer了。默认情况下c=‘\’,d=‘:’,一般来说分隔符只能指定两个字符,当使用GNU扩展的时候,可以指定多个字符,也可以指定为空字符串(此时将禁用页分区的功能了)。
4.3. -i number或--line-increment=number
这个选项指定行号的增量,例如初始行号是1,那么下一行是2,此时增量为1(默认是1),也可以指定负数。
4.4. -l number或--join-blank-lines=number
当有至少number个连续的空行的时候,只为最后一个空行设置行号,当连续空行个数小于number的时候,不为这些空行设置行号。空行指的是这一行,除了换行符以外,没有其他字符。
4.5. -n format 或 --number-format=format
指定行编号的样式,format有如下几个可选的值:
- ln:左对齐,没有前导0
- rn:右对齐,没有前导0(默认)
- rz:右对齐,右前导0
nl输出的每一行的格式可以描述为这样:
行号区域 行号和内容的分隔区域 内容其区域
其中行号区域默认是6字符宽度,当我们的行号从一个比较小的数开始的时候,比如1,那么这个1是如何放置?
其中左对齐即(x表示空出来的字符):
1xxxxx 行号和内容的分隔区域 内容其区域
右对齐是:
xxxxx1 行号和内容的分隔区域 内容其区域,
右对齐,有前导0,即:
000001 行号和内容的分隔区域 内容其区域,
4.6. -p 或 --no-renumber
这个选项指定了当一个新的页开始的时候,行号不要从新开始。一般来说,我们可以定义多个header,body和footer,当上一个footer结束,下一个header开始的时候,即为新的一页,新的页开始的时候,行号从新开始的。
4.7. -s string 或 --number-separator=string
上面说了,nl输出的每一行的行号和内容之间有分隔区域,这个选项设置行号和行内容之间的分隔区域,默认是TAB,可以指定任何字符串。
4.8. -v number 或 --starting-line-number=number
设置行号的初始值,默认是1
4.9. -w number 或 --number-width=number
上面说了,nl输出的每一行的行号区域默认是6字符宽度,这个选项用来设置行号区域的字符宽度。