Unix의 명령 컷 범위

Unix의 명령 컷 범위

다음과 같이 문자열을 자르기 위해 'cut' unix 명령을 사용하려는 쉘 스크립트를 만들려고 합니다.

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

그러나 쉘을 실행하면 다음 오류가 발생합니다.

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

이전에는 'cut' 명령을 사용하여 하한 위치로 0을 사용했던 기억이 있는데, 지금은 명령이 1에서 시작해야 한다고 합니다. 왜? 운영 체제에 따라 달라집니까? 예전에는 SunOS를 사용했는데 이제는 우분투 12.04를 사용합니다.

답변1

아니요, 모든 구현에서 동일합니다 cut. 숫자는 1부터 시작합니다. 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(적어도 2014년 3월 27일 현재)는 바이트 단위로 계산되는 -c반면, Solaris 또는 ksh는 cutPOSIX에서 요구하는 대로 문자 단위로 계산된다는 것입니다.

$ 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

예, 아마도 OS(또는 버전을 작성한 사람 cut)에 따라 다를 수 있습니다.

를 살펴보면 GNU의 바이트, 문자 및 필드 수가 1부터 시작하는 man cut것을 볼 수 있습니다 .cutcoreutils

-b, -c 또는 -f 중 하나만 사용하십시오. [...] 각 범위는 다음 중 하나입니다.
      질소      질소'1부터 계산되는 첫 번째 바이트, 문자 또는 필드

다시 말하지만, 관리자가 cutGNU 이외의 구현을 사용하기로 결정한 경우 이는 시스템마다 다를 수 있으므로 맨페이지를 확인하여 안전하게 확인하는 것이 가장 좋습니다.

답변3

Linux에서도 작동했습니다. 방금 (데비안에서, cut 명령이 포함된 coreutils 패키지를 업데이트한 후) 그것에 물려서 이 버그를 발견했습니다.

이것은 coreutils의 버그입니다.

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

누군가 의도적으로 이전 버전과의 호환성을 깨뜨렸지만 아무도 이를 고치지 않았습니다. 예전에는 0이 괜찮은 것처럼 보였고 1로 처리되었습니다. 이제 0은 오류를 생성합니다. 따라서 이 동작에 의존하는 모든 스크립트는 손상되므로 변경해야 합니다.

관련 정보