
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 cut
las 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 0
y 1
allí significa el primer carácter y 2
significa el segundo carácter:
$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te
busybox
cut
o el cut
incorporado ksh93
tampoco se queja. GNU cut
simplemente 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 cut
cuentan 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 cut
GNU coreutils
cuenta 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 cut
distinta 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.