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

我可以为此使用什么语法?

有帮助吗?

解决方案

cut -d ' ' -f 2

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

其他提示

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

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

tr -s ' ' | cut -d ' ' -f 2

awk '{print $2}'

补充现有的、有用的答案;帽子尖到 QZ支持 鼓励我发表单独的答案:

两种不同的机制 在这里发挥作用:

  • (a) 是否 cut 本身 需要将分隔符(在本例中为空格)传递给 -d 选项成为 单独论证 或者附加它是否可以接受 直接地-d.

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

(a) 的答案是引用自 实用程序的 POSIX 指南 (强调我的)

如果标准实用程序的概要显示带有 强制的 选项参数 [...] 一致的应用程序 应使用 分离 该选项的参数及其选项参数. 然而, ,符合要求的实施应 允许应用程序在同一参数字符串中指定选项和选项参数,而无需插入字符.

换句话说:在这种情况下, 因为 -d的选项参数是 强制的, 你可以 选择 是否指定分隔符为:

  • (s) 要么:A 分离 争论
  • (d) 或:作为一个值 直接附着-d.

一旦您选择了 (s) 或 (d), 的字符串文字解析 - (b) - 这很重要:

  • 随着方法 (数), ,以下所有形式都是等效的:

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

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

等价性由下式解释 的字符串文字处理:

全部 上述解决方案导致 完全相同的字符串 (每组)到时 cut 看到他们:

  • (数): cut 看到 -d, , 就像它一样 自己的 论证,然后是 分离 包含空格字符的参数 - 不带引号或 \ 字首!。

  • (四): cut 看到 -d 空格字符 - 不带引号或 \ 字首!- 作为的一部分 相同的 争论。

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

  • shell 允许指定文字 按原样 通过 一种称为 引用, ,这可以采取 几种形式:
    • 单引号 字符串:里面的内容 '...' 被采取 字面上地 并形成一个 单身的 争论
    • 双引号 字符串:里面的内容 "..." 也形成了一个 单身的 论据,但受制于 插值法 (扩展变量引用,例如 $var, ,命令替换($(...) 或者 `...`),或算术展开式 ($(( ... ))).
    • \- 引用 个人 人物:A \ 前面的单个字符会导致该字符被解释为文字。
  • 引用的补充是 报价删除, ,这意味着一旦 shell 解析了命令行,它就会 删除 参数中的引号字符 (附上 '...' 或者 "..." 或者 \ 实例) - 因此, 被调用的命令永远看不到引号字符.

你也可以说

cut -d\  -f 2

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

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

cut "-d "

测试

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

scut ,一种剪切式实用程序(更智能但更慢我可以使用任何perl正则表达式作为破坏令牌。打破空白是默认设置,但你也可以打破多字符正则表达式,替代正则表达式等。

scut -f='6 2 8 7' < input.file  > output.file

所以上面的命令会破坏空格上的列并按顺序提取(0-based)cols 6 2 8 7。

如果数据具有多个空格,则无法通过剪切轻松完成。我发现规范化输入以便于处理很有用。一个技巧是使用sed进行标准化,如下所示。

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

我有一个答案(我承认有些令人困惑的答案)涉及sed, 、正则表达式和捕获组:

  • \S* - 第一个字
  • \s* - 分隔符
  • (\S*) - 第二个词 - 捕获
  • .* - 其余部分

作为一个 sed 表达式中,捕获组需要转义,即 \(\).

\1 返回捕获组的副本,即第二个词。

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

当你看到这个答案时,它有点令人困惑,你可能会想,为什么要麻烦呢?好吧,我希望有些人可能会“啊哈!”并将使用此模式解决一些复杂的文本提取问题 sed 表达。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top