如何将制表符转换为 bash 脚本中的确切空格数



我需要将带制表符的字符串转换为带空格的字符串。

但是我需要空格数以匹配制表符,以便格式相同。

我需要这个,因为 Gnuplot 标签不喜欢标签。

所以我想要:

A      very       fat      cat

这是Atverytfattcat,转换为:

A      very       fat      cat

带空格,而不是

A very fat cat

编辑 1

我想我误解了这个问题:

$ cat -T Aggregate/summary.txt | head -n1
      Date        Pnl     AnnPnl  Days  AvTrds  AveVol  AveDur TDays      Pnl/$  AvPnl     StdDev       MAXD  Shrpe

但是当我分配给一个变量时,空格会丢失:

$ FF=`cat Aggregate/summary.txt | head -n1`; echo $FF
Date Pnl AnnPnl Days AvTrds AveVol AveDur TDays Pnl/$ AvPnl StdDev MAXD Shrpe
您可以使用

expand命令:

~$ cat >c
a       fast    cat     nrstaui e
~$ expand c>d

使用 cat -A 时,您可以看到使用了空格(制表符由 ^I 表示):

~$ cat -A c
a^Ifast^Icat^Inrstaui^Ie$
~$ cat -A d
a       fast    cat     nrstaui e$

编辑:如果将行分配给变量,则必须使用双引号来查看差异:

~$ F=$(cat c)
~$ echo "$F" |cat -A
a^Ifast^Icat^Inrstaui^Ie$
~$ echo $F |cat -A
a fast cat nrstaui e$

空格也有同样的问题:

~$ F=$(cat d)
~$ echo "$F" |cat -A
a       fast    cat     nrstaui e$
~$ echo $F |cat -A
a fast cat nrstaui e$

有一个实用程序专门用于此:expand .
expand [file](或来自标准输入)应该可以解决问题。

回复:您的编辑,

使用带引号的 POSIX 样式命令替换而不是反引号:

FF="$(cat Aggregate/summary.txt | head -n1)"; echo "$FF"

了解为什么将制表符空格转换为单个空格字符

让我们将您的变量重命名为"变量"并为其分配以下内容

variable ="      Date        Pnl     AnnPnl  Days  AvTrds  AveVol  AveDur TDays      Pnl/$  AvPnl     StdDev       MAXD  Shrpe"

[1] 当你这样做时

echo $variable

您的输出将是

Date Pnl AnnPnl Days AvTrds AveVol AveDur TDays Pnl/$ AvPnl StdDev MAXD Shrpe

原因:echo 不是将您的变量视为一个大字符串,而是将几个字符串视为由空格或多个空格字符组成的字符串。这是因为 bash 没有将此变量视为一个字符串,因为该变量未包含在双 qoutes 中。

[2] 当你这样做时

 echo "$variable"

您的输出将是

      Date        Pnl     AnnPnl  Days  AvTrds  AveVol  AveDur TDays      Pnl/$  AvPnl     StdDev       MAXD  Shrpe

原因:这是因为您用双引号将变量括起来,bash将自动解释为一个大字符串。结果,回显将打印这个大字符串。

最新更新