tur*_*tle 84 command-line text-processing quoting columns
我想使用 Unixcolumn命令来格式化一些文本。我有由制表符分隔的字段,但在每个字段中也有空格。column分隔空白(制表符和空格)。如何使列仅使用制表符作为分隔符?
我试图使用以下命令将制表符指定为分隔符:
cat myfile | column -t -s"\t"
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 114
column -t -s '\t'
Run Code Online (Sandbox Code Playgroud)
将分隔列\和t字符。
column -s \t与 相同column -s t,因为反斜杠被 shell 解释为引用运算符。
在这里,您想将一个真正的 TAB 字符传递给列。使用 ksh93、zsh、bash、mksh、busybox sh 或 FreeBSD sh:
column -ts $'\t'
Run Code Online (Sandbox Code Playgroud)
或者通过Ctrl-V Tab在 shell 提示符下键入来输入一个真正的制表符(在引号内或前面有一个反斜杠,因为制表符是 shell 语法中的标记分隔符,就像空格一样),或者使用"$(printf '\t')"(禁用 split+glob 所需的那些双引号运算符作为制表符也恰好在 ) 的默认值中$IFS。
对于 POSIX,$'...'未定义,也称为 ANSI-C 转义。
相反,你可以使用$(printf '\t'):
column -t -s "$(printf '\t')"
Run Code Online (Sandbox Code Playgroud)
$(printf '\011')可以使用,因为011(十进制 9 的八进制表示)是水平制表符的 ANSI 代码:
column -t -s "$(printf '\011')"
Run Code Online (Sandbox Code Playgroud)
但是,请参阅下面来自 Stéphane Chazelas 的评论,了解为什么这在不同的 shell 版本中可能不一致。
我使用了以下内容(仅适用于您的文本不包含|):
cat myfile | tr '\t' '|' | column -t -s '|'
Run Code Online (Sandbox Code Playgroud)
这只是用管道替换制表符,然后使用带有管道的列作为分隔符。
(我这样做是因为我在 Stéphane 的答案中没有看到任何在鱼壳中开箱即用的内容。否则,Stéphane 的答案似乎不错。)