В чем разница между опциями cut -b и -c?

Я искал в Интернете примеры, прошел справочное руководство cut Команда и проверил это сам и не уверены в -b флаг. Нет четких примеров того, как cut -b команда работает. Может кто-нибудь создать файл примера и показать, как он явно используется?

1 ответ

Решение

Программное обеспечение GNU описано в info страницы, так что давайте посмотрим, что info cut говорит:

'-b BYTE-LIST' '--bytes=BYTE-LIST'
Выберите для печати только байты в позициях, перечисленных в СПИСОК БАЙТОВ. Вкладки и возвраты обрабатываются как любой другой символ; они занимают 1 байт. Если указан выходной разделитель (см. Описание "--output-delimiter"), выведите эту строку между диапазонами выбранных байтов.

'-c CHARACTER-LIST' '--characters=CHARACTER-LIST'
Выберите для печати только символы в позициях, перечисленных в СПИСОК ХАРАКТЕРОВ. То же самое, что и "-b", но интернационализация изменит это. Вкладки и возвраты обрабатываются как любой другой символ; они занимают 1 символ. Если указан выходной разделитель (см. Описание "--output-delimiter"), выведите эту строку между диапазонами выбранных байтов.

Это из coreutils 8.28, поставляемой с Ubuntu 18.04 и 18.10, добавление многобайтовой поддержки выполняется и может привести к другому поведению этих двух опций в будущем.

xxd -g1 показывает шестнадцатеричные байтовые эквиваленты символов (после двоеточия), сгруппированные по байтам, а также его представление ASCII слева. Возьмите в качестве примера:

$ printf a | xxd -g1
00000000: 61                                               a
$ printf á | xxd -g1
00000000: c3 a1                                            ..

a однобайтовый символ с шестнадцатеричным эквивалентом 61, тогда как á является двухбайтовым символом с шестнадцатеричным эквивалентом c3 a1. Посмотрим как cut из coreutils 8.28 ведет себя, если мы пытаемся вырезать первый байт или символ соответственно (0a это просто символ новой строки, добавленный cut и можно игнорировать)

$ 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
Другие вопросы по тегам