
Я пытаюсь создать скрипт оболочки, я хочу вырезать строку с помощью команды 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
, вы увидите, что cut
GNU 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 выдает ошибку. Поэтому все скрипты, которые зависят от этого поведения, сломаны и должны быть изменены.