我在网上搜索了示例,查阅了命令的参考手册cut
并亲自测试了它,但仍然不确定该-b
标志。没有任何清晰的示例说明该cut -b
命令如何工作。有人可以创建一个示例文件并清楚地展示如何使用它吗?
答案1
GNU 软件的描述有info
好几页,让我们看看具体info cut
说了什么:
'-b BYTE-LIST' '--bytes=BYTE-LIST'
选择仅打印 BYTE-LIST 中列出的位置的字节。制表符和退格符与其他字符一样处理;它们占用 1 个字节。如果指定了输出分隔符(请参阅“--output-delimiter”的描述),则在选定字节范围内输出该字符串。'-c CHARACTER-LIST' '--characters=CHARACTER-LIST'
选择仅打印 CHARACTER-LIST 中列出的位置上的字符。 目前与‘-b’相同,但国际化将改变这一点。 制表符和退格符与其他字符一样处理;它们占用 1 个字符。如果指定了输出分隔符(请参阅“--output-delimiter”的描述),则在选定字节范围内输出该字符串。
这是来自 Ubuntu 18.04 和 18.10 附带的 coreutils 8.28,正在添加多字节支持并且将来可能会使这两个选项的行为有所不同。
xxd -g1
显示按字节分组的字符(冒号后)的十六进制转储字节等效值以及左侧的 ASCII 表示。例如:
$ printf a | xxd -g1
00000000: 61 a
$ printf á | xxd -g1
00000000: c3 a1 ..
a
是单字节字符,其十六进制等价于 61,而á
是双字节字符,其十六进制等价于 c3 a1。让我们看看cut
如果我们尝试分别截取第一个字节或字符(0a
只是添加的换行符cut
,可以忽略), coreutils 8.28 会如何表现:
$ printf ab | cut -b1 | xxd -g1
00000000: 61 0a a.
$ printf ab | cut -c1 | xxd -g1
00000000: 61 0a a.
$ printf áb | cut -b1 | xxd -g1
00000000: c3 0a .. # first byte of á
$ printf áb | cut -b2 | xxd -g1
00000000: a1 0a .. # second byte of á
$ printf áb | cut -c1 | xxd -g1
00000000: c3 0a .. # first byte of á
$ printf áb | cut -c2 | xxd -g1
00000000: a1 0a .. # second byte of á
当它被实施时,预期的行为是:
$ printf ab | cut -b1 | xxd -g1
00000000: 61 0a a.
$ printf ab | cut -c1 | xxd -g1
00000000: 61 0a a.
$ printf áb | cut -b1 | xxd -g1
00000000: c3 0a .. # first byte of á
$ printf áb | cut -b2 | xxd -g1
00000000: a1 0a .. # second byte of á
$ printf áb | cut -c1 | xxd -g1
00000000: c3 a1 0a ... # both bytes of á
$ printf áb | cut -c2 | xxd -g1
00000000: 62 0a b. # second char = b