使用空格作为带切割命令的分隔符

Jae*_*ebi 298 unix bash cut

我想使用空格作为cut命令的分隔符.

我可以使用什么语法?

Ric*_*dle 335

cut -d ' ' -f 2
Run Code Online (Sandbox Code Playgroud)

其中2是您想要的以空格分隔的字段的字段编号.

  • 你不能在`cut`中使用正则表达式,但你可以用`cut`试图"修复"所有`cut`限制:https://github.com/arielf/cuts (6认同)
  • 你能告诉 cut 使用任意数量的某个字符作为分隔符,就像在 RegEx 中一样吗?例如任意数量的空格,例如 \s+ (3认同)
  • @foampile不,我不相信你可以. (3认同)

Ben*_*ela 153

通常,如果使用空格作为分隔符,则需要将多个空格视为一个空格,因为您解析命令的输出,将某些列与空格对齐.(以及google搜索引导我来到这里)

在这种情况下,单个cut命令是不够的,您需要使用:

tr -s ' ' | cut -d ' ' -f 2
Run Code Online (Sandbox Code Playgroud)

要么

awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

  • 感谢awk示例用法,正是我需要的. (2认同)

mkl*_*nt0 40

补充现有的,有用的答案; 帽子的尖端QZ支持鼓励我发布一个单独的答案:

这里有两种截然不同的机制:

  • (a)cut 本身是否要求将分隔符(在这种情况下为空格)传递给-d选项作为单独的参数,或者是否可以将其直接附加到-d.

  • (b)shell在将参数传递给被调用的命令之前通常如何解析参数.

(a)通过POSIX公用事业指南的引用回答(强调我的)

如果标准实用程序的SYNOPSIS显示带有强制选项参数[...]的选项,则符合条件的应用程序应对该选项及其选项参数使用单独的参数.然而,一个符合标准的实现应允许应用程序指定同一参数串的选项,选项参数中间没有字符.

换句话说:在这种情况下,因为-d's option-argument是必需的,所以您可以选择是否将分隔符指定为:

  • (s)EITHER:一个单独的论点
  • (d)OR:作为值直接附着-d.

一旦你选择了(s)或(d),它就是shell的字符串 - 字面解析 - (b) - 这很重要:

  • 随着办法(S) ,以下所有形式是等价的:

    • -d ' '
    • -d " "
    • -d \<space> # <space> used to represent an actual space for technical reasons
  • 使用方法(d),以下所有形式都是等价的:

    • -d' '
    • -d" "
    • "-d "
    • '-d '
    • d\<space>

shell的字符串文字处理解释了等价:

上面的cut所有解决方案在看到它们产生完全相同的字符串(在每个组中):

  • (s):cut看到-d,作为它自己的参数,后跟一个包含空格char 的单独参数 - 没有引号或\前缀!

  • (d):cut看到-d 加上空格char - 没有引号或\前缀!- 作为同一论点的一部分.

其原因在各组的形式是最终相同是双重的,基于所述如何解析字符串文字:

  • shell允许通过称为引用的机制按原样指定文字,可以采用以下几种形式:
    • 单引号字符串:里面的内容'...'字面,并形成一个单一的参数
    • 双引号字符串:里面的内容"..."也形成一个单一的参数,但受到插值(扩大变量引用如$var,命令取代($(...)`...`),或算术扩展($(( ... ))).
    • \- 单个字符的引用:\前面的单个字符会导致该字符被解释为文字.
  • 引用被补充引用的去除,这意味着,一旦外壳已经解析的命令线,就删除从参数的引用字符(封闭'...'"..."\由此, -实例)该命令被调用从未看到引号字符.


Cha*_*ens 35

你也可以说

cut -d\  -f 2
Run Code Online (Sandbox Code Playgroud)

请注意反斜杠后有两个空格.

  • 非常不可读 - 谁注意到有2个空格? (40认同)
  • 知道'\'逃脱下一个角色的人会非常小心地注意接下来会发生什么.使用'\'来逃避像这样的空格字符是一个非常常见的习语. (29认同)
  • @Jonathan Hartley通常大部分代码都是不可读的:) (2认同)

fed*_*qui 6

刚刚发现你也可以使用"-d "

cut "-d "
Run Code Online (Sandbox Code Playgroud)

测试

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
Run Code Online (Sandbox Code Playgroud)

  • 请注意_从`cut`的角度来看_以下所有内容都是相同的:`"-d "`、`'-d '`、`-d" "`、`-d' '` 和`-d\&lt; space&gt;`:所有形式直接将选项参数(一个空格)附加到选项(`-d`)并在 `cut` 看到它们时产生_完全相同的字符串_:一个包含 d 后跟一个空格的参数,在 _shell_ 执行 [引用删除](http://www.gnu.org/software/bash/manual/html_node/Quote-Removal.html#Quote-Removal) 之后 (4认同)

Ans*_*ssi 5

如果数据有多个空格,你就不能用 cut 轻松地做到这一点。我发现标准化输入以便于处理很有用。一个技巧是使用 sed 进行标准化,如下所示。

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar
Run Code Online (Sandbox Code Playgroud)