Диапазон команды cut в unix

Диапазон команды cut в unix

Я пытаюсь создать скрипт оболочки, я хочу вырезать строку с помощью команды unix «cut», как показано ниже:

namecmpaux=$(echo $namecmp |cut -c0-19)

Но когда я запускаю оболочку, она выдает следующую ошибку:

cut: fields and positions are numbered from 1 
Try `cut - help 'for more information.

Я помню, что раньше использовал команду «cut», используя ноль в качестве нижнего предела, но теперь мне говорят, что команда должна начинаться с 1. Почему? Зависит от операционной системы? Раньше использовал SunOS, а теперь использую Ubuntu 12.04

решение1

Нет, это то же самое в каждой cutреализации. Числа начинаются с единицы, просто Solaris не будет жаловаться, если вы предоставите 0, и будет воспринимать его как 1. Оба 0и 1там означают первый символ, а 2означает второй символ:

$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te

busybox cutили cutвстроенный ksh93тоже не жалуется. GNU cutпросто пытается быть полезным, сообщая вам, что вы, вероятно, не имеете правильного представления о том, какой индекс первый.

Однако реальное различие заключается в том, что GNU и busybox cut(по крайней мере, по состоянию на 27.03.2014) считают в байтах -c, тогда как Solaris или ksh cutсчитают в символах (как того требует POSIX).

$ echo 'Stéphane' | cut -c 1-4
Sté
$ echo 'Stéphane' | busybox cut -c 1-4
Sté
$ echo 'Stéphane' | ksh -c 'command /opt/ast/bin/cut -c 1-4'
Stép

(в локали UTF-8 é (U+00E9) занимает 2 байта)

решение2

Да, это действительно может зависеть от ОС (или, скорее, от того, кто написал вашу версию cut).

Если вы посмотрите на man cut, вы увидите, что cutGNU coreutilsподсчитывает байты, символы и поля с 1:

Используйте один и только один из параметров -b, -c или -f. [...] Каждый диапазон представляет собой один из следующих:
      Н      Н'й байт, символ или поле, отсчитываемый от 1

Опять же, это может отличаться в другой системе, если ее сопровождающие решили использовать реализацию, cutотличную от GNU, поэтому лучше перестраховаться и заглянуть в man-страницу, чтобы убедиться.

решение3

Раньше это работало даже на Linux. Я просто был укушен этим (на Debian, после обновления пакета coreutils, который содержит команду cut) и нашел эту ошибку.

Это ошибка в coreutils:

https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262

Кто-то намеренно сломал обратную совместимость, и никто ее не исправил. Раньше было так, что 0 тоже был в порядке и рассматривался как 1. Теперь 0 выдает ошибку. Поэтому все скрипты, которые зависят от этого поведения, сломаны и должны быть изменены.

Связанный контент