如果指定的字段不存在,cut 返回什么?

Kli*_*wer 6 text-processing cut

我有一个字符串:

6.40.4
Run Code Online (Sandbox Code Playgroud)

第二个:

6.40
Run Code Online (Sandbox Code Playgroud)

我正在使用var=$(echo $versionfull | cut -d'.' -f3)从 bash 中的第一个字符串中获取第三个数字。这个命令为第二个返回什么?它看起来空的,但无论是[ -z $var ][ $var == "" ]不工作。0如果是第二个字符串,我想给它一个值。

Jef*_*ler 11

要回答您的直接问题,根据规范cut,除了尾随换行符外不返回任何内容(感谢don_crissti提供该参考):

echo "$versionfull" | cut -d. -f3 | od -c
0000000  \n
0000001
Run Code Online (Sandbox Code Playgroud)

如果您有一个支持 here-strings 的 shell,您可以执行以下操作:

IFS=. read a b c <<< "$versionfull"
Run Code Online (Sandbox Code Playgroud)

注意 的引用$versionfull,以防它有空格(来自 的任何内容$IFS)。

如果您认为这c可能是空的,请要求将其设置为零:

c=${c:-0}
Run Code Online (Sandbox Code Playgroud)

  • 注意需要在`IFS=中引用。read abc &lt;&lt;&lt; "$versionfull"` 仅适用于旧版本的 `bash`;其他 shell 和较新版本的 `bash` 没有这个问题。 (2认同)

小智 10

你可以使用var=$(echo "${versionfull}.0" | cut -d'.' -f3).

在第一种情况下,versionfull将包含 6.40.4.0,忽略填充并根据需要返回 4。在第二种情况下,.0将填充并返回。

  • 令人遗憾的是,这被标记为解决方案,因为它甚至没有回答问题,这是每个人将来带着同样的问题来到这里时都会期望找到的。也许应该更改问题以反映 OP 实际上并不关心它返回的内容。 (3认同)

Sté*_*las 9

cut 有一个奇怪的 API。

cut -f n将输出至少有一个分隔符的每一行的n字段(如果该行的分隔符少于 n-1 个(少于 n 个字段),则为空),并返回完整行(因此是第一个字段) '没有任何分隔符:

$ echo a.b.c | cut -d. -f3
c
$ echo a.b | cut -d. -f3

$ echo a | cut -d. -f3
a
Run Code Online (Sandbox Code Playgroud)

那么如果指定的字段不存在那么 cut 会返回什么的答案是第一个字段还是空字段,具体取决于输入行是否有一个或多个字段。

您可以添加删除没有任何分隔符的行的-s选项,以避免出现上述奇怪的最后一种情况,但这通常不是您想要的(您通常希望将该输入行考虑为具有空的第三个字段)完全跳过它),如果你想要第一个字段,这是值得的:

$ echo a | cut -sd. -f2
$ echo a | cut -sd. -f1
$
Run Code Online (Sandbox Code Playgroud)

(您要求输入第一个字段,输入只有一个字段,但您没有得到任何输出,因为输入没有分隔符)。

所以@ThoriumBR 添加一个的建议.0是一个很好的建议。没有它:

versionfull=5
echo "$versionfull" | cut -d. -f3
Run Code Online (Sandbox Code Playgroud)

实际上会输出 5。通过添加.0,我们确保输入至少有一个分隔符。我会更进一步并使用:

echo "$versionfull.0.0" | cut -d. -f3
Run Code Online (Sandbox Code Playgroud)

确保输入至少有 3 个字段。