Rango del comando cortado en Unix.

Rango del comando cortado en Unix.

Estoy intentando crear un script de Shell, quiero cortar una cadena usando el comando Unix 'cortar', de la siguiente manera:

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

Pero cuando ejecuto el shell me dice el siguiente error:

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

Recuerdo que anteriormente usé el comando 'cortar' usando cero como posición límite inferior, pero ahora me dice que el comando debe comenzar en 1. ¿Por qué?, ¿depende del sistema operativo? Anteriormente usé SunOS y ahora estoy usando ubuntu 12.04

Respuesta1

No, es lo mismo en todas cutlas implementaciones. Los números comienzan en uno, es solo que el de Solaris no se quejará si proporciona 0 y lo tratará como 1. Ambos 0y 1allí significa el primer carácter y 2significa el segundo carácter:

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

busybox cuto el cutincorporado ksh93tampoco se queja. GNU cutsimplemente intenta ser útil diciéndole que probablemente no tenga la idea correcta sobre cuál es el primer índice.

Sin embargo, una diferencia real es que GNU y Busybox cut(al menos a partir del 27 de marzo de 2014) cuentan en bytes -c, mientras que Solaris o ksh cutcuentan en caracteres (como lo requiere 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

(en una configuración regional UTF-8, é (U+00E9) ocupa 2 bytes)

Respuesta2

Sí, eso podría depender del sistema operativo (o más bien de quién escribió su versión cut).

Si echas un vistazo a man cut, verás que cutGNU coreutilscuenta bytes, caracteres y campos desde 1:

Utilice uno y sólo uno de -b, -c o -f. [...] Cada rango es uno de:
      norte      norte'ésimo byte, carácter o campo, contado desde 1

Nuevamente, esto puede diferir en un sistema diferente si sus mantenedores han decidido usar una implementación cutdistinta a la GNU, así que es mejor estar seguro y echar un vistazo a la página de manual para estar seguro.

Respuesta3

Incluso funcionó antes en Linux. Me acaba de picar (en Debian, después de una actualización del paquete coreutils que contiene el comando cortar) y encontré este error.

Es un error en coreutils:

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

Alguien rompió la compatibilidad con versiones anteriores a propósito y nadie lo arregló. Solía ​​ser así, 0 también estaba bien y se trataba como 1. Ahora 0 produce un error. Por lo tanto, todos los scripts que dependen de este comportamiento no funcionan y deben cambiarse.

información relacionada