
我正在嘗試製作一個 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 並將其0
視為1 1
。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。因此,所有依賴此行為的腳本都會被破壞,必須進行更改。