如何在 BASH 中用“cut”定义“tab”分隔符?

Muh*_*han 300 bash cut

下面是一个cut使用空格分隔符将输入分成多个字段并获取第二个字段的示例:

cut -f2 -d' '

如何将分隔符定义为制表符而不是空格?

Bir*_*rei 414

两种方式:

Ctrl+V然后Tab使用“逐字”引用的 insert

cut -f2 -d'   ' infile
Run Code Online (Sandbox Code Playgroud)

或这样写以使用ANSI-C 引用

cut -f2 -d$'\t' infile
Run Code Online (Sandbox Code Playgroud)

  • $'' - bash'ism, AFAIR (11认同)
  • 显然,这两种方法都不适用于 Windows(例如 Git Bash)。在那里使用@Mikel 的答案(默认分隔符是制表符,只需省略 `-d` 参数)。 (10认同)
  • [在脚本中使用 $“dollarsign-prefixed string”是什么意思?](http://unix.stackexchange.com/a/48122/85163) (7认同)
  • @poige,来自`ksh93`,而不是`bash`。至少 ksh93、zsh、bash、mksh 和 FreeBSD sh 支持这一点([它可能会成为下一次对 `sh` POSIX 标准规范的重大修订](http://austingroupbugs.net/view.php?id) =249))。 (4认同)
  • @micurb 那是 ANSI-C 引用:https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html (4认同)

Mik*_*kel 256

选项卡是默认设置。

请参阅剪切手册页

-d delim
         Use delim as the field delimiter character instead of the tab
         character.
Run Code Online (Sandbox Code Playgroud)

所以你应该写

cut -f 2
Run Code Online (Sandbox Code Playgroud)

  • 这个答案改变了我的生活 (12认同)
  • 但是为了可读性和可移植性,明确提及这些标志可能总是更安全。我可以想象有些人为 Windows 设计 `cut` 不会遵循完整的标准。 (4认同)
  • 这应该是公认的答案:最简单的代码,最简单的解释。你搞定了:https://www.youtube.com/watch?v=dpNTHl7y45Y (4认同)
  • @WillemVanOnsem,如果有人为 Windows 编写了一个 `cut` 版本并且不遵循 [POSIX 规范](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html),则有没有理由假设*任何* POSIX 脚本将与该系统一起工作。坚持使用 POSIX 指定的功能。不要试图允许假设的未来不合规的实现;这不是“便携性”的意思。 (3认同)
  • 哎呀没有注意到那条线。 (2认同)

小智 16

awk -F '\t' '{ print $2 }' inputfile
Run Code Online (Sandbox Code Playgroud)

这将从 中提取每行输入的第二个制表符分隔字段inputfile

  • OP 专门询问了“cut”。此外,“cut(1)”比“awk(1)”快*waaay*。 (2认同)

nob*_*bar 11

更一般地说,不需要任何不可见的字符:tr用于将分隔符转换为可以更轻松地指定为cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b
Run Code Online (Sandbox Code Playgroud)

tr 是一个简单但功能强大的字符匹配和替换工具。

  • 但是如果输入是“abc(space)def(tab)ghi”怎么办?你的答案将产生“def”,但它应该产生“ghi”。类似地,如果输入是“ABC(tab)DEF(space)GHI”,您的答案将产生“DEF”,但它应该产生“DEF(space)GHI”。 (2认同)