我想使用空格作为
我可以使用什么语法?
cut
命令的分隔符。我可以使用什么语法?
cut -d ' ' -f 2
数字 2 是你想要的以空格分隔的字段的字段编号。
cut
命令中使用正则表达式,但是你可以使用cuts
命令,它试图"修复"所有cut
的限制:https://github.com/arielf/cuts。 - arielfcut -d ' ' -f 3,6,9,12,15,18
,而不必指定每个数字? - Monocitotr -s ' '
来将所有多个空格的出现压缩为一个,使得 cut -d ' '
在因对齐而导致行中出现可变数量的空格的情况下变得非常有用。实际上可以在此答案中找到:https://dev59.com/AHRA5IYBdhLWcg3wzhbZ#19069428 - NeilGcut
命令是不够的,您需要使用:tr -s ' ' | cut -d ' ' -f 2
或者
awk '{print $2}'
[ \t]+
。AWK解决方案的额外好处是可以透明地处理数据行上的前导/尾随空格,而tr
+ cut
解决方案则不行。tr
可以翻译或删除字符。-s
选项将重复的字符替换为单个出现。 - young_souvlakicut
或者 tr
的例子。对于我所做的任务(在多个空格之间拆分输出),awk
的例子完美地运行了。 - Alf47tr
是一个"过滤器",_只能_从标准输入接收输入,_只能_将输出写入标准输出。它不理解文件名参数,如果你尝试传递一个文件名给它,甚至可能不会报错。这只是你需要学习的其中一件事情。你的cut
和tr
在Linux或其他类Unix系统上应该基本上是一样的,所以我鼓励你继续尝试,并查看手册页中的示例部分。 - undefinedcut
本身是否需要将分隔符(在这种情况下是空格)传递给-d
选项作为一个单独的参数,还是可以直接附加到-d
上。-d
的选项参数是强制性的,您可以选择将分隔符指定为:-d
。(s): cut
看到 -d
,作为它自己的参数,后面跟着一个包含空格字符的单独参数 - 然后没有引号或 \
前缀!。
(d): cut
看到 -d
加上一个空格字符 - 然后没有引号或 \
前缀! - 作为同一个参数的一部分。
这两个组中的形式最终相同的原因有两个,基于shell 如何解析字符串字面量:
外壳允许通过称为“引用”的机制来指定文字,这样可以按原样指定文字。引用可以采用多种形式: - 单引号字符串:在`'...'`内部的内容被直接采用,形成一个单独的参数。 - 双引号字符串:在`"..."`内部的内容也形成一个单独的参数,但会进行插值处理(扩展变量引用,如`$var`,命令替换(`$(...)`或`` `...` ``),或算术扩展(`$(( ... ))`))。 - 通过`\`对个别字符进行引用:在单个字符前加上`\`,使该字符被解释为文字。cmd.exe
的语法(仅支持"
引号,^
作为转义字符),或者PowerShell的语法(```作为转义字符)。 - mklement0--delimiter=
参数,所有这些解释都没有意义,尤其是在shell脚本中。 - undefinedunix
,而不是linux
,所以使用可移植
的语法非常重要,并指出使用了哪些特定于实现的扩展(我已更新答案,提到了--delimiter
)。
更重要的是,无论您使用符合POSIX的-d
还是GNU特定的--delimiter
选项,对于解决方案来说没有任何区别
(唯一的区别是在后一种情况下,直接附加选项参数需要使用=
作为分隔符,现在在答案中已经说明)。 - undefined你也可以这样说:
cut -d\ -f 2
请注意反斜杠后面有两个空格。
\
是我的第一次尝试并且它起作用了。我同意与' '
相比,它不太明显,但我相信许多人很高兴在这里阅读到它以确认其行为。为了更好地理解,请参见@mklement0的下面评论。 - tresf-d
后面跟着分隔符的人可能会认为 \ 是分隔符 :) - Michael P. Bazoscut
的角度来看,以下所有内容都是相同的:"-d "``,'-d '
,-d" "
,-d' '
,和-d\<space>
: 所有这些形式都直接将选项参数(一个空格)附加到选项(-d
),并在cut
看到它们时得到完全相同的字符串:一个包含d后跟一个空格的单个参数,在_shell_执行引号移除之后。 - mklement0如果数据中有多个空格,使用cut命令无法轻松处理。因此,我发现将输入规范化可以更容易地进行处理。其中一个技巧是使用sed命令进行规范化,如下所示。
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar
scut是一种类似cut的实用工具(我做得更聪明但速度较慢),它可以使用任何perl正则表达式作为分隔符。默认情况下,以空格为分隔符,但您也可以使用多字符正则表达式、备选正则表达式等进行分隔。
scut -f='6 2 8 7' < input.file > output.file
我有一个答案(我承认有点混乱),它涉及到sed
、正则表达式和捕获组:
\S*
- 第一个单词\s*
- 分隔符(\S*)
- 第二个单词 - 已捕获.*
- 行的其余部分作为一个sed
表达式,捕获组需要被转义,即\(
和\)
。
\1
返回已捕获组的副本,即第二个单词。
$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta
sed
表达式即可。
man
页面没有解释这个,因为它与cut
_特别_无关,而与shell如何解析字符串文字以及如何解析POSIX兼容实用程序选项参数_一般_有关。 - mklement0man
手册不够充分。 让我们看一下:"-d delim
使用delim
作为字段定界符而不是制表符。"(适用于BSDcut
,但GNU版本和POSIX规范基本上也表示相同)。 因此,使用 shell 调用cut
- 典型情况 - 需要您知道如何使用 shell syntax 通常传递一个空格作为参数,这可以说并不是cut
man页面的工作。然而,真实世界的例子总是有帮助的,而 GNU 手册则缺少这些内容。 - mklement0