Bash 使用“剪切”命令将空格用作分隔符
我想在Bash 使用“剪切”命令将空格用作分隔符,bash,unix,cut,Bash,Unix,Cut,我想在cut命令中使用空格作为分隔符 我可以使用什么语法 cut -d ' ' -f 2 其中2是所需空格分隔字段的字段号。您也可以说: cut -d\ -f 2 请注意,反斜杠后面有两个空格。,这是一个类似于cut的实用程序(我做的更智能但速度较慢),可以使用任何perl正则表达式作为中断标记。默认情况下,中断空白,但也可以中断多字符正则表达式、可选正则表达式等 scut -f='6 2 8 7' < input.file > output.file scut-f='6
cut
命令中使用空格作为分隔符
我可以使用什么语法
cut -d ' ' -f 2
其中2是所需空格分隔字段的字段号。您也可以说:
cut -d\ -f 2
请注意,反斜杠后面有两个空格。,这是一个类似于cut的实用程序(我做的更智能但速度较慢),可以使用任何perl正则表达式作为中断标记。默认情况下,中断空白,但也可以中断多字符正则表达式、可选正则表达式等
scut -f='6 2 8 7' < input.file > output.file
scut-f='6 2 8 7'output.file
因此,上面的命令将打断空格上的列,并按该顺序提取(基于0的)cols 6 2 8 7 通常,如果使用空格作为分隔符,则需要将多个空格视为一个空格,因为要解析将某些列与空格对齐的命令的输出。(而谷歌对这一点的搜索让我走到了这里) 在这种情况下,单个
cut
命令是不够的,您需要使用:
tr -s ' ' | cut -d ' ' -f 2
或
我建议您也可以使用“-d”
:
试验
补充现有的有用答案;感谢您鼓励我单独发布答案:
两种不同的机制在这里发挥作用:
- (a)
本身是否需要传递给cut
选项的分隔符(在本例中为空格)作为单独的参数,或者是否可以将其直接附加到-d
-d
- (b) shell在将参数传递给被调用的命令之前通常是如何解析参数的
-d
的选项参数是必需的,您可以选择是否将分隔符指定为:
- (s) 任一:一个独立的参数
- (d) 或者:作为值直接附加到
-d
- 对于方法(s),以下所有形式都是等效的:
-d'
-d”“
-d\#出于技术原因,用于表示实际空间
- 对于方法(d),以下所有形式都是等效的:
-d'
-d”“
“-d”
'-d'
d\
cut
看到它们时会产生完全相同的字符串(每组):
- (s):
将cut
视为自己的参数,后跟一个单独的参数,该参数包含一个空格字符,不带引号或-d
前缀\
- (d):
查看cut
加空格字符-不带引号或-d
前缀作为同一论点的一部分\
- shell允许通过名为quoting的机制按原样指定文本,该机制可以采用多种形式:
- 单引号字符串:
中的内容按字面理解并形成单个参数“…”
- 双引号字符串:
中的内容也构成一个参数,但要进行插值(扩展变量引用,如“…”
、命令替换($var
或$(…)
),或算术扩展(`.`
)$(…)
-引用单个字符:单个字符前面的\
会将该字符解释为文字\
- 单引号字符串:
- 引号由补充,这意味着一旦shell解析了命令行,它就会从参数中删除引号字符(包括
或'…
或“…”
实例)-因此,被调用的命令永远看不到引号字符\
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/'
贝塔
当你看到这个答案时,你可能会觉得有点困惑,而且你可能会想,为什么要麻烦呢?好吧,我希望有些人可能会说“啊哈!”并使用这种模式来解决一些复杂的文本提取问题,只需一个sed
表达式。不正确,手册页
cut "-d "
$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am
echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2 #bar