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)
小智 10
你可以使用var=$(echo "${versionfull}.0" | cut -d'.' -f3)
.
在第一种情况下,versionfull
将包含 6.40.4.0,忽略填充并根据需要返回 4。在第二种情况下,.0
将填充并返回。
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 个字段。