使用空格作为切割命令的分隔符。
当使用空格作为分隔符时,通常希望将多个空格视为一个,因为需要使用空格对齐某些列的命令的输出进行解析。然而,如果只使用单个cut命令,则无法实现这一点。为了解决这个问题,可以使用以下两种方法:
方法一:使用tr和cut命令
tr -s ' ' | cut -d ' ' -f 2
方法二:使用awk命令
awk '{print $2}'
这两种方法的原理是一样的。AWK命令的默认输入字段分隔符是一个或多个空白字符;在正则表达式中,它类似于[ \t]+。AWK解决方案的额外好处是可以透明地处理数据行上的前导/尾随空格,而tr + cut解决方案则不能。
在一些评论中,某些情况下了在Mac上使用cut或tr命令无法正常工作的问题。对于这种情况,使用awk命令是一个可行的解决方法。
需要注意的是,tr命令是一个"过滤器",只接收标准输入并将结果输出到标准输出。它不接受文件名作为参数,并且如果尝试传递文件名给tr命令,可能不会收到错误消息。所以在使用tr命令时需要注意这一点。
总结起来,当需要处理以空格作为分隔符的数据时,使用单独的cut命令可能无法满足需求。可以通过使用tr命令和cut命令的组合,或者直接使用awk命令来解决这个问题。同时,需要注意在使用tr命令时只接收标准输入和输出的特性。
问题:
在使用cut命令时,为什么会出现(Use space as a delimiter with cut command)这个问题?如何解决这个问题?
解决方法:
在解决这个问题之前,首先需要了解两个不同的机制:
(a) cut命令本身是否要求将分隔符(在这种情况下为空格)传递给-d选项作为一个单独的参数,或者是否可以直接附加到-d选项上。
(b) shell在将参数传递给被调用命令之前如何解析这些参数。
关于问题(a)的答案可以在POSIX实用工具的指南中找到,它明确规定了:
如果标准实用工具的概要中显示了一个带有必需的选项参数的选项[…],符合规范的应用程序“应当对该选项及其选项参数使用单独的参数”。然而,符合规范的实现还应允许应用程序在同一参数字符串中指定选项和选项参数,而无需插入字符。
换句话说:在这种情况下,由于-d的选项参数是必需的,你可以选择将分隔符指定为:
(s):作为一个单独的参数
(d):直接附加到-d上作为一个值
一旦你选择了(s)或(d),就取决于shell的字符串解析(b):
对于方法(s),以下所有形式都是等效的:
-d ' '
-d " "
-d \ (这是一个转义空格,用于字面上使用)
对于方法(d),以下所有形式都是等效的:
-d' '
-d" "
"-d "
'-d '
d\
这种等效性是基于shell解析字符串字面值的方式:
所有上述解决方案在cut命令看到它们时都会生成完全相同的字符串(在每个组中):
(s):cut会看到-d作为它自己的参数,后面是一个包含空格字符的单独参数,没有引号或\前缀!
(d):cut会看到-d加上一个空格字符,没有引号或\前缀!作为同一个参数的一部分。
这些组中的形式最终是相同的原因有两个,基于shell解析字符串字面值的方式:
shell允许通过称为引用的机制指定字面值,它可以采用多种形式:
单引号字符串:在'...'中的内容被字面上采用,并形成一个单独的参数
双引号字符串:在"..."中的内容也形成一个单独的参数,但会进行插值(展开变量引用,如$var,命令替换($(...)或`...`),或算术展开($((...)))。
个别字符的\引用:在单个字符前加上\将导致该字符被解释为字面值。
引用与引号的移除相互补充,这意味着一旦shell解析了命令行,它会从参数中移除引号字符(任何包围的'...'或"..."或未引用的\实例),因此被调用的命令从未看到引号字符。
对于Gow的cut只有双引号选项有效:-d" ",-d " ","-d "。所有使用单引号或空格的选项都无效。
是的,问题出现在shell解析引号样式上,而鉴于Gow运行在Windows上,你需要使用cmd.exe的语法(仅限于"引用,^作为转义字符)或PowerShell的语法(`作为转义字符)。
使用--delimiter=可以忽略所有这些解释,特别是在shell脚本中。
这篇文章解释了为什么会出现(Use space as a delimiter with cut command)这个问题,以及如何解决这个问题。它通过解释cut命令的两个不同机制以及shell如何解析参数来提供了解决方法。对于问题(a),可以选择将分隔符作为单独的参数或直接附加到-d选项上。对于问题(b),根据shell的解析方式,提供了不同的等效形式。最后,文章还提到了Gow在Windows上的特殊情况,以及使用--delimiter=选项的情况。
文章的重点是解决问题,提供了清晰简洁的解释和解决方法,对于需要使用cut命令的开发人员来说是非常有帮助的。