Linux 中的 fold 命令详解及C/C++代码实现

Linux fold 命令带来了不守规矩的输出。 通过控制输出的宽度来读取大量文本、无穷无尽的字符串和未格式化的流。

Linux 终端中的文本行如何工作

什么是一行文本?它是一个字符序列——字母、数字、符号和空格——以一个特殊的字节结尾,意思是“开始新的一行”。在 Linux 和 Unix 中,换行符(也称为换行符)用作行尾指示符。这是一个字节,十六进制值为 0x0a,十进制值为 10。

不同的操作系统使用不同的字节值来表示一行的结束。 Windows 使用两字节序列。在 Windows 文本文件中,换行符后面紧跟回车符,十六进制为 0x0d,十进制为 13。

Linux fold 命令

Linux fold 获取文本行并根据您提供的参数将它们分成块。 如果没有参数, fold 将在 80 个字符处换行。

fold 命令将每个输入行换行以适应指定的宽度。 这是此命令的语法:

fold [OPTION]… [FILE]…

Linux 中的 fold 命令非常简单,只有几个不同的选项可供您使用。 因此,您只需花一点时间就可以学会如何使用它。 查看下面的示例以快速掌握此命令。

1.如何使用 fold 命令包装输出

默认情况下,当您使用 cat 显示文件的内容时,显示的输出会覆盖整个屏幕宽度。 要将占用的宽度限制为 80 列,请改用 fold 命令。

fold [file-name]

2.如何自定义输出中的列数

如果您希望每行在默认值 80 之外的其他字符限制处换行,则可以在 fold 命令中使用 -w 或 --width 选项。 这是一个示例,我们指示 fold 将每行换行为 50 个字符。

fold -w[n] [file-name]


3.如何使fold计数字节(不是列)

如果您希望 fold 命令根据每行中有多少字节而不是字符来换行,您可以在命令中使用 -b 或 --bytes 选项。

fold -b [n]

以上命令将在60 个字节处换行。或者,使用 -w 命令来指定字节数。

4.如何在空格处折断

如果你查看前面示例中的屏幕截图,你会注意到有时会在单词中间换行。 发生这种情况是因为 fold 命令在换行到下一行之前应该显示的字符或字节有硬性限制。

我们可以使用 -s 或 --spaces 选项来指示 fold 命令在下一个空格处换行。 这样,单词中间就不会出现换行符。


当然,也可以随意将其他选项与 -soption 结合使用。

fold命令使用的API

  • 1.wcrtomb - 将宽字符转换为多字节序列

#include <wchar.h>
size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps);

此函数的主要情况是当 s 不是 NULL 并且 wc 不是空宽字符 (L’\0’) 时。 在这种情况下,wcrtomb() 函数将宽字符 wc 转换为其
多字节表示并将其存储在 s 指向的字符数组的开头。 它更新移位状态 *ps,并返回所述多字节表示的长度
tation,即在 s 处写入的字节数。

一种不同的情况是 s 不为 NULL,但 wc 为空宽字符 (L’\0’)。 在这种情况下,wcrtomb() 函数将移位存储在 s 指向的字符数组中
将 *ps 带回初始状态所需的序列,后跟一个 ‘\0’ 字节。 它更新移位状态 *ps(即,使其进入初始状态),并返回长度
移位序列加一,即在 s 处写入的字节数。

  • 2.wcwidth - 确定宽字符所需的列

#define _XOPEN_SOURCE /* See feature_test_macros(7) */
#include <wchar.h>
int wcwidth(wchar_t c);

wcwidth() 函数返回表示宽字符 c 所需的列数。 如果 c 是可打印的宽字符,则该值至少为 0。如果 c 为空宽 ,字符(L’\0’),值为0。否则返回-1。

Linux中 fold命令C/C++实现

...
int main(int argc, char **argv)
{
	while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1) 
	{
		switch (ch) 
		{
			case 'b':
				bflag = 1;
				break;
			case 's':
				sflag = 1;
				break;
			case 'w':
				if ((width = atoi(optarg)) <= 0) 
				{
					errx(1, "illegal width value");
				}
				break;
			case '0': case '1': case '2': case '3': case '4':
			case '5': case '6': case '7': case '8': case '9':
				switch (previous_ch) 
				{
					case '0': case '1': case '2': case '3': case '4':
					case '5': case '6': case '7': case '8': case '9':
						width = width * 10 + (ch - '0');
						break;
					default:
						if (width == -1)
							width = ch - '0';
						break;
				}
				break;
			default:
				usage();
		}
		previous_ch = ch;
	}
	argv += optind;
	argc -= optind;

...
}

编译运行:


总结

当您想将文本段落转换为没有那么多字符并在单词边界处中断的单独行时,fold 命令非常有用。 这可以使查看大文本变得更加容易。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值