unix中命令cut的范围

unix中命令cut的范围

我正在尝试制作一个 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。 Both01there 表示第一个字符,并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,你会发现cutGNU 的coreutils字节、字符和字段计数从 1 开始:

使用 -b、-c 或 -f 之一,且仅其中之一。 [...] 每个范围是以下之一:
            '第一个字节、字符或字段,从 1 开始计数

同样,如果维护者决定使用cutGNU 以外的实现,则在不同的系统上这可能会有所不同,因此最好确保安全并查看联机帮助页以确保确定。

答案3

它以前甚至可以在 Linux 上运行。我只是被它咬住了(在 Debian 上,在更新包含 cut 命令的 coreutils 软件包之后)并发现了这个错误。

这是 coreutils 中的一个错误:

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

有人故意破坏了向后兼容性,但没有人修复它。以前好像 0 也可以,并被视为 1。现在 0 会产生错误。因此,所有依赖于此行为的脚本都会被破坏,必须进行更改。

相关内容