Linux 中的 nl 命令详解及C/C++代码实现(文件行数)

在Linux 操作系统中,如果想编辑文本文件时,希望显示在其前面附加行号的行,这时 Linux 中 nl 命令就派上用场,nl 命令对文件中的行进行编号。

Linux nl命令

nl 命令是一个 Unix/Linux 实用程序,用于为行编号,接受来自文件或来自 STDIN 的输入。 它将每个指定的文件复制到 STDOUT,并在行前附加行号。

nl [OPTION]… [FILE]…

为了快速了解nl命令,我们创建了一个文本文档,里面内容是以前写的脚本。 使用 nl 命令,我们将向您展示如何在此文本文档中添加行号。

在这里插入图片描述

通过学习Linux 中nl 命令。 请按照以下说明了解可用于此命令的各种选项。

-b, --body-numbering=STYLE
       use STYLE for numbering body lines

-d, --section-delimiter=CC
       use CC for separating logical pages

-f, --footer-numbering=STYLE
       use STYLE for numbering footer lines

-h, --header-numbering=STYLE
       use STYLE for numbering header lines

-i, --line-increment=NUMBER
       line number increment at each line

-l, --join-blank-lines=NUMBER
       group of NUMBER empty lines counted as one

-n, --number-format=FORMAT
       insert line numbers according to FORMAT

-p, --no-renumber
       do not reset line numbers at logical pages

-s, --number-separator=STRING
       add STRING after (possible) line number

-v, --starting-line-number=NUMBER
       first line number on each logical page

-w, --number-width=NUMBER
       use NUMBER columns for line numbers

--help display this help and exit

--version
       output version information and exit

nl 命令将为文件中的所有或部分行添加序号。 一旦你知道了语法。 在下面的示例中,使用该命令介绍一些最常用的选项,展示如何根据文件的格式调整命令选项。

如何在 Linux 上使用 nl 命令

1.将行号添加到文件中
要将行号添加到文件中,只需将文件名传递给 nl 命令即可。 默认情况下,行号将添加到文件中的每一行。

在这里插入图片描述默认情况下,输出会添加一个制表符,然后是行号,最后是文本本身。

2.使用 -s 选项改变格式

我们试着稍微改变一下格式。 格式化行号的一种常见方法是在数字后面加上句点。 要使用 nl 命令执行此操作,我们将使用 -s 选项。 我们还将指定“.”

在这里插入图片描述表示我们希望行号以点和空格开头。

3.去掉行号前面的空格

如果我们想操作行号前面的空格,可以使用 -w选项来完成。 为了完全消除空间,我们将指定宽度为 1。

在这里插入图片描述

请注意,我们仍在使用上一个示例中的 -s 选项,它将结合两种格式更改。

4.为空行编号

默认情况下,nl 命令不会为空行编号。只有带有文本的行才会被编号。 如果您还需要为空行编号,可以使用 -b a 选项来完成。

在这里插入图片描述

5.从特定行号开始编号

如果想从 1 以外的某个数字开始编号,可以使用带有 nl 的 -v 选项并指定其他数字。 例如,我们将从 50 开始对行进行编号。

在这里插入图片描述6.覆盖默认增量

Linux 中的默认增量模式是 1。这可以使用 -i 选项进行更改。 第一行号是 1,不能使用 -i 更改。
在这里插入图片描述
7.要在每行包含前导零

要在每行包含前导零,可以将 -n rz 选项与 nl 一起使用。

在这里插入图片描述
linux nl命令C/C++代码实现

int main(int argc, char **argv)
{

	while ((c = getopt(argc, argv, "pb:d:f:h:i:l:n:s:v:w:")) != -1) 
	{
		switch (c) 
		{
			case 'p':
				restart = 0;
				break;
			case 'b':
				parse_numbering(optarg, BODY);
				break;
			case 'd':
				clen = mbrlen(optarg, MB_CUR_MAX, NULL);
				if (clen == (size_t)-1 || clen == (size_t)-2)
					errx(EXIT_FAILURE,"invalid clen argument -- %s", optarg);
				if (clen != 0) 
				{
					memcpy(delim1, optarg, delim1len = clen);
					clen = mbrlen(optarg + delim1len,
						MB_CUR_MAX, NULL);
					if (clen == (size_t)-1 ||clen == (size_t)-2)
						errx(EXIT_FAILURE,"invalid clen argument -- %s", optarg);
					if (clen != 0) 
					{
						memcpy(delim2, optarg + delim1len,delim2len = clen);
						if (optarg[delim1len + clen] != '\0')
							errx(EXIT_FAILURE,"invalid delim argument -- %s",optarg);
					}
				}
				break;
			case 'f':
				parse_numbering(optarg, FOOTER);
				break;
			case 'h':
				parse_numbering(optarg, HEADER);
				break;
			case 'i':
				errno = 0;
				val = strtol(optarg, &ep, 10);
				if ((ep != NULL && *ep != '\0') ||
				 ((val == LONG_MIN || val == LONG_MAX) && errno != 0))
					errx(EXIT_FAILURE,"invalid incr argument -- %s", optarg);
				incr = (int)val;
				break;
			case 'l':
				errno = 0;
				uval = strtoul(optarg, &ep, 10);
				if ((ep != NULL && *ep != '\0') ||
					(uval == ULONG_MAX && errno != 0))
					errx(EXIT_FAILURE, "invalid num argument -- %s", optarg);
				nblank = (unsigned int)uval;
				break;
			case 'n':
				if (strcmp(optarg, "ln") == 0) 
				{
					format = FORMAT_LN;
				} 
				else if (strcmp(optarg, "rn") == 0) 
				{
					format = FORMAT_RN;
				} 
				else if (strcmp(optarg, "rz") == 0) 
				{
					format = FORMAT_RZ;
				} 
				else
					errx(EXIT_FAILURE,"illegal format -- %s", optarg);
				break;
			case 's':
				sep = optarg;
				break;
			case 'v':
				errno = 0;
				val = strtol(optarg, &ep, 10);
				if ((ep != NULL && *ep != '\0') ||
				 ((val == LONG_MIN || val == LONG_MAX) && errno != 0))
					errx(EXIT_FAILURE,"invalid startnum value -- %s", optarg);
				startnum = (int)val;
				break;
			case 'w':
				errno = 0;
				val = strtol(optarg, &ep, 10);
				if ((ep != NULL && *ep != '\0') ||
				 ((val == LONG_MIN || val == LONG_MAX) && errno != 0))
					errx(EXIT_FAILURE,"invalid width value -- %s", optarg);
				width = (int)val;
				if (!(width > 0))
					errx(EXIT_FAILURE,"width argument must be > 0 -- %d",width);
				break;
			case '?':
			default:
				usage();

		}
	}
	argc -= optind;
	argv += optind;

	switch (argc) 
	{
		case 0:
			break;
		case 1:
			if (strcmp(argv[0], "-") != 0 &&
				freopen(argv[0], "r", stdin) == NULL)
				err(EXIT_FAILURE, "%s", argv[0]);
			break;
		default:
			usage();
	}

	...
}

编译运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

Linux 中的 nl 命令是数字行的缩写。 如果有一个大文本文档并且需要添加行号,nl 命令是不二之选。 无需经历手动为每行编号,只需从命令行使用 nl 即可在几秒钟内完成。更多信息可以使用 man 命令来阅读有关 nl 命令及其官方文档的更多信息。

欢迎关注微信公众号【程序猿编码】,需要nl 命令完整源码的添加本人微信号(c17865354792)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值