我想列出一些文本行(存储在变量或文件中),从第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
提前致谢。
答案 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
命令:
line1
12
line2
34
line3
56
\n
,以便跳过当前提示(那个
有echo
命令)并转到下一行(这会使光标到来
在适当的位置)。 运行上述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:/ $
注意:12
,34
和56
不会被覆盖,您还会写出line1
,line2
和line3
。< / 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:如果您可以让我们更深入地了解您的输入文件是如何组织的......我们可以使用其他一些多文件命令,例如paste
,awk
等
Edit1:我的坏。纠正了我的回答
Edit2:由于您无法访问tabs
或expand
命令,因此您还可以使用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; }'