如何使用列来分隔制表符而不是空格?

如何使用列来分隔制表符而不是空格?

我想使用 Unixcolumn命令来格式化一些文本。我有由制表符分隔的字段,但每个字段内也有空格。column以空白(制表符和空格)分隔。如何使列仅使用制表符作为分隔符?

我试图使用以下命令指定制表符作为分隔符:

cat myfile | column -t -s"\t"

答案1

列 -t -s '\t'

\将在和字符上分隔列t

column -s \t与 相同column -s 't',因为反斜杠被 shell 解释为引用运算符。

这里你想将一个真正的制表符传递给列。使用 ksh93、zsh、bash、mksh、busybox sh 或 FreeBSD sh:

column -ts $'\t'

或者通过在 shell 提示符下键入来输入真正的制表符Ctrl-V Tab(在引号内或前面加反斜杠,因为制表符是 shell 语法中的标记分隔符,就像空格一样),或者使用"$(printf '\t')"(禁用 split+glob 所需的双引号)运算符作为制表符也恰好在$IFS) 的默认值中。

答案2

对于 POSIX,$'...'未定义 ,即 ANSI-C 转义。

相反,您可以使用POSIX$(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')可以使用,因为011(十进制 9 的八进制表示)是水平制表符的 ANSI 代码:

column -t -s "$(printf '\011')"

然而,这是不鼓励的,因为它是在此评论的以及 Stéphane Chazelas 的回答。这是因为它在 shell 版本之间可能不一致,因为 POSIX 没有指定编码TAB 的值是。仍然有 POSIX 系统的 C 语言环境编码是基于 EBCDIC 的,其中 TAB 是 5,而不是像 ASCII 中的 9。只要有可能,最好按名称引用字符(\t此处)以避免此类问题。请注意,$'...'计划包含在 2018 年 9 月 10 日起的 POSIX 规范的下一个主要版本中。

答案3

我使用了以下内容(仅当您的文本不包含时才有效|):

cat myfile | tr '\t' '|' | column -t -s '|'

这只是用管道替换制表符,然后使用带有管道的列作为分隔符。

(我这样做是因为我没有看到任何内容史蒂芬的回答在鱼壳中开箱即用。否则,史蒂芬的回答看起来不错。)

答案4

用于-t选择所需的列数。将此留空不会改变任何内容。另外,你想要在之后有空格,-s所以试试这个:

cat myfile | column -s \t

相关内容