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 並將其0視為1 12

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

busybox cutcut內建的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。因此,所有依賴此行為的腳本都會被破壞,必須進行更改。

相關內容