cut 的 -b 和 -c 选项有什么区别?

cut 的 -b 和 -c 选项有什么区别?

我在网上搜索了示例,查阅了命令的参考手册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

相关内容