如何设置终端的标签大小(没有"标签"或"展开")

时间:2016-03-06 06:06:38

标签: shell awk tabs

我想列出一些文本行(存储在变量或文件中),从第3列开始,但这样做不会覆盖第1列和第2列。

因此,使用制表符(\t)开始每一行似乎是一个合适的解决方案。不幸的是,我的终端的标签大小似乎固定为8(而不是期望的3)。

不幸的是我没有命令tabs,因为我正在使用busybox / ash。即使expand也无济于事,因为第1列和第2列将被空格覆盖。

那么有标签的替代方案吗?如果有可能设置标签大小,awk(printf)可能是一个解决方案吗?

示例:

TEXT="line1
line2
line3"
echo "$TEXT" | sed 's/^/\t/'

提供

         line1
         line2
         line3

但我想要

  line1
  line2
  line3

提前致谢。

2 个答案:

答案 0 :(得分:1)

为了避免替换前2列,您需要手动将光标移动到第3列并从那里开始写入。你不能使用空格(使用expand)因为那会用空格覆盖前2列。(标签不要覆盖)

您可以使用echo以及以下转义序列将光标定位在行/ L和列C

  \033[<L>;<C>H
     Or
  \e[<L>;<C>H
     Or
  \e[<L>;<C>f
     Or
  \033[<L>;<C>f

以下是一个例子:

输出第一个echo命令:

shell@OnePlus2:/ $ clear
shell@OnePlus2:/ $ echo "12\n34\n56"                                           
12
34
56
shell@OnePlus2:/ $ 

现在我们将编写另一个执行以下操作的echo命令:

  1. 将光标移至第2行第3列,并在line1
  2. 之后写下12
  3. 将光标移至第3行第3列,并在line2
  4. 之后写下34
  5. 将光标移至第4行第3列,然后在line3
  6. 之后写下56
  7. 写出换行符\n,以便跳过当前提示(那个 有echo命令)并转到下一行(这会使光标到来 在适当的位置)。
  8. 运行上述echo命令后,我们将获得以下内容:

    shell@OnePlus2:/ $ echo "12\n34\n56"                                           
    12line1
    34line2
    56line3
    shell@OnePlus2:/ $ echo -e "\e[2;3fline1\033[3;3fline2\e[4;3fline3\n"          
    shell@OnePlus2:/ $ 
    

    注意:123456不会被覆盖,您还会写出line1line2line3。< / p>

    注意:第一个clear命令非常重要,因此您的终端上只有提示,因为行和列值是硬编码的(2,3,4行和每行第3列)。但是,您可以根据需要修改我的示例。

    如果您想在此之前从第3列和空格打印,可以使用:

    shell@OnePlus2:/ $ printf "  %s\n" 'line1' 'line2' 'line3'                     
      line1
      line2
      line3
    shell@OnePlus2:/ $ 
    

    有关转义序列的详细信息,请参阅:http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html

    如果您有权访问tput,请参阅:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html

    PS:即使我使用受限制的shell,也不是完整的bash shell:

    shell@OnePlus2:/ $ echo $SHELL
    /system/bin/sh
    shell@OnePlus2:/ $ 
    

    正如您所见,我已通过android与我的sh shell adb相关联。由于您使用的busybox也适用于android,因此应该没问题。但是,我们没有使用任何高端shell功能,只使用echo和转义序列。

    PPS:如果您可以让我们更深入地了解您的输入文件是如何组织的......我们可以使用其他一些多文件命令,例如pasteawk

    Edit1:我的坏。纠正了我的回答

    Edit2:由于您无法访问tabsexpand命令,因此您还可以使用setterm -regtabs 2将标签宽度/尺寸设置为2(它不会&#39} ;虽然提出了错误:xterm),但却在setterm: terminal xterm does not support --regtabs中工作 但是,我能够在通过Ctrl+Alt+F[1-6]访问的文本模式虚拟终端中运行它。

答案 1 :(得分:1)

您的终端可能支持在当前行内移动的控制序列,而不是使用需要指定行和列的控制序列。参考XTerm Control Sequences

CSI Pm `  Character Position Absolute  [column] (default = [row,1])
          (HPA).

将是

printf '\033[%d`' $col
在shell中

。此外,您的文本可能会在文本之后覆盖以前写入的数据。您可以使用另一个控制序列清除它:

CSI ? Ps K
          Erase in Line (DECSEL).
            Ps = 0  -> Selective Erase to Right (default).
            Ps = 1  -> Selective Erase to Left.
            Ps = 2  -> Selective Erase All.

sed对于生成转义字符有点尴尬。以下是awk中的建议:

TEXT="line1
line2
line3"
echo "$TEXT" | awk '{ printf "\033[3`%s\033[K\n", $0; }'