首页 » nl - 添加行号

nl - 添加行号

程序员有个简单的需求,那就是列出行号。即在文件的每一行前,添加一个行号。

很多文本编辑器自带了这样的功能,如Vim中,运行:

:se nu

即可列出行号。(要想真正地在文本中插入行号,参考这里

运行cat -n也可以实现这个需求:

$ cat -n /etc/bashrc

一行代码的实现

也可以通过一行代码,自己实现类似的功能:

$ if=/etc/bashrc && ef=/tmp/render.sh && o=$(expr length $(cat $if|wc -l)) && echo "awk 'BEGIN{i=0}{printf(\"%${o}d %s\n\", ++i, \$0)}' $if" > $ef | bash $ef

分析行代码。首先是2个变量:

  • if - 目标文件(Input File)。
  • ef - 一个临时生成的脚本文件。

接下来是用wc -l统计目标文件的行数;用expr length计算加行号后需要的偏移。例如文档有200行,则为了实现以下的行号对齐效果,则需要printf("%3d"),即expr length 200输出3:

  1 Line-1
...
 10 Line-10
...
100 Line-100

之后生成一个脚本文件,它的内容如下:

awk 'BEGIN{i=0}{printf("%3d %s\n", ++i, $0)}' /etc/bashrc

即用awk遍历目标文件的每一行,且在每行前添加一个行号。这里的关键是为什么要生成一个临时脚本,而不是直接执行这个awk命令?缘故在于偏移值(以上是3)需要是一个数字常量,而不能是这样的一个变量:

printf("%3d") [OK]
printf("%${offset}d")   [ERROR]

最后就是执行这个脚本:

bash /tmp/render.sh

用nl输出行号

man nl输出的解释就是:

nl - number lines of files

可见nl就是行号输出专业户。以下是它的常见用法:

为每一行添加行号,跳过空白行:

$ nl /etc/bashrc

为每一行添加行号,空白行前也加行号:

$ nl -ba /etc/bashrc

nl输出是右对齐,且偏移值为6,可以用-w更改偏移:

$ nl -w3 /etc/bashrc

nl输出行号与内容的间隔是\t,可以用-s修改之:

$ nl -s " " /etc/bashrc

分享

0