我正在尝试制作一个 shell 脚本,我想使用 'cut' unix 命令来剪切字符串,如下所示:
namecmpaux=$(echo $namecmp |cut -c0-19)
但是当我运行 shell 时,会出现以下错误:
cut: fields and positions are numbered from 1
Try `cut - help 'for more information.
我记得以前使用'cut'命令使用零作为下限位置,但现在告诉我该命令应该从1开始。为什么?取决于操作系统?以前使用 SunOS,现在使用 ubuntu 12.04
答案1
不,每个实现都是一样的cut
。数字从 1 开始,只是 Solaris 不会抱怨如果您提供 0 并将其视为 1。 Both0
和1
there 表示第一个字符,并2
表示第二个字符:
$ echo test | cut -c 0-2
te
$ echo test | cut -c 1-2
te
busybox
cut
或者cut
内置的ksh93
也不要抱怨。 GNUcut
只是试图帮助您告诉您,您可能对第一个索引没有正确的了解。
但真正的区别是 GNU 和 busybox cut
(至少截至 2014 年 3 月 27 日)以字节为单位计数-c
,而 Solaris 或 kshcut
以字符为单位计数(按照 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 以外的实现,则在不同的系统上这可能会有所不同,因此最好确保安全并查看联机帮助页以确保确定。
答案3
它以前甚至可以在 Linux 上运行。我只是被它咬住了(在 Debian 上,在更新包含 cut 命令的 coreutils 软件包之后)并发现了这个错误。
这是 coreutils 中的一个错误:
https://bugs.launchpad.net/ubuntu/+source/coreutils/+bug/211262
有人故意破坏了向后兼容性,但没有人修复它。以前好像 0 也可以,并被视为 1。现在 0 会产生错误。因此,所有依赖于此行为的脚本都会被破坏,必须进行更改。