我想使用空格作为cut
命令的定界符。
我可以使用什么语法?
man
页面不够用。让我们来看看:“ -d delim
使用delim
作为字段分隔符,而不是制表符。” (BSD cut
,但GNU版本和POSIX规范几乎相同)。使用外壳来调用cut
-典型案例-因此需要你知道如何通常通过一个空间使用参数shell语法,这无疑不是cut
男人页的工作。实际示例总是有帮助的,但是,GNU手册页缺少它们。
我想使用空格作为cut
命令的定界符。
我可以使用什么语法?
man
页面不够用。让我们来看看:“ -d delim
使用delim
作为字段分隔符,而不是制表符。” (BSD cut
,但GNU版本和POSIX规范几乎相同)。使用外壳来调用cut
-典型案例-因此需要你知道如何通常通过一个空间使用参数shell语法,这无疑不是cut
男人页的工作。实际示例总是有帮助的,但是,GNU手册页缺少它们。
Answers:
cut -d ' ' -f 2
其中2是所需的以空格分隔的字段的字段号。
cut -d ' ' -f 3,6,9,12,15,18
而不必指定每一个数字?
补充现有的,有用的答案;帽子给小费QZ支持鼓励我发布一个单独的答案:
两种不同的机制在这里起作用:
(a)cut
本身是否要求传递给-d
选项的定界符(在这种情况下为空格)是一个单独的参数,或者是否可以将其直接附加到-d
。
(b)shell在将参数传递给被调用的命令之前通常如何解析参数。
(a)由POSIX公用事业指南(强调我的)引述
如果标准实用程序的摘要显示带有强制性选项参数的选项,则符合标准的应用程序应对该选项及其选项参数使用单独的参数。然而,一个符合标准的实现应还允许应用程序指定同一参数串的选项,选项参数中间没有字符。
换句话说:在这种情况下,因为-d
的option-argument是强制性的,所以您可以选择是否将分隔符指定为:
-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
视为自己的参数,然后是包含空格字符的单独参数-不带引号或\
前缀!
(d) :cut
看到-d
加一个空格字符-不带引号或\
前缀!-作为相同论点的一部分。
各个组中的形式最终相同的原因是双重的,这取决于外壳如何解析字符串文字:
'...'
取字面,并形成一个单一的参数"..."
也形成单个参数,但可以进行插值(扩展变量引用,例如$var
,命令替换($(...)
或`...`
)或算术扩展($(( ... ))
)。\
的-quoting 个别字符:一个\
单个字符之前使该字符被解释为一个文字。'...'
或"..."
或\
实例) -从而,该命令被调用不会看到引号字符。您还可以说:
cut -d\ -f 2
请注意,反斜杠后面有两个空格。
\
是我的第一次尝试,并且有效。我同意与相比' '
,它不那么明显,但是我敢肯定,很多人很高兴在这里阅读它,以确保行为安全。为了更好的理解,请参阅下面的@ mklement0评论。
'-d '
。