В чем разница между опциями 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