题
我想使用空格作为分隔符 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
请注意反斜杠后面有两个空格。
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
表达。