cut 命令上的分隔符参数是否总是期望它位于字符串之间?

cut 命令上的分隔符参数是否总是期望它位于字符串之间?

今天我注意到cut命令中的一些东西,尽管我已经使用和使用它们很长时间了,但不知何故我以前从未注意到过。

/users/developer/我想从字符串中提取users。所以,我所做的是,

echo `pwd` | cut -d '/' -f1

这并没有给我带来任何回报。我的假设是,由于我已指定/为分隔符,因此它应该在找到分隔符后返回我的第一个字段。

经过一番调整后,我意识到当我更改命令来检索时,我可以获得所需的输出f2

echo `pwd` | cut -d '/' -f2

这让我想到,分隔符总是期望某物位于它的左侧,这就是为什么在尝试检索第一个字段时,它没有返回任何内容,而当我尝试检索第二个字段时,我得到了我所期望的结果。

从逻辑上讲,对于 a 来说这是有道理的delimiter。我只是想知道,这真的是 cut 命令中分隔符参数的工作原理吗?换句话说,我的推论是否正确(该分隔符总是期望某些东西位于分隔符的左侧)

答案1

f1是空的,就像前面的 first 一样 /

 echo "/some/path/to/some/location" | cut -d '/' -f1
      |
      +--- empty

f1echo "是和 first之间的内容/


换句话说:空并不是不存在。或者字符串/字段可以没有字符,如"".

例如,如果您看一下这样的内容,可能会更清楚:

[In Data]   [Output fields]
             1  2  3  4  5 -f
A:B::D:E  => A, B,  , D, E
A::C:D:E  => A,  , C, D, E
:B:C:D:   =>  , B, C, D, 

左边,介于,或右 - 空或不空。场就是场。

答案2

页面中没有任何内容man可以info明确证实这一点,但是

   -f, --fields=LIST
          select only these fields;  also print any line that contains no delimiter character, unless the -s option is specified

这表明第一个字段位于第一个分隔符之前(即使该分隔符实际上不存在)。

对我来说,我从来没有怀疑过它是这样工作的,但这可能不是你需要的答案;-)。

答案3

这个定义似乎很清楚。看着维基百科关于分隔符的文章

分隔符是一个或多个字符的序列,用于指定纯文本或其他数据流中单独的、独立的区域之间的边界。1分隔符的一个示例是逗号字符,它充当逗号分隔值序列中的字段分隔符。

定界符代表指定数据流中边界的各种方法之一。例如,声明性表示法是一种替代方法,它在数据流开头使用长度字段来指定数据流包含的字符数。

它在第一句话中说,“......指定单独的、独立的区域之间的边界......”。我认为这意味着正如你所推断的那样。

相关内容