如何在 shell 脚本中覆盖多行文本?

6

我想要在终端上重复写入多行文本。就像这样:

echo "One Line"
echo "Two Lines"
echo "\r\b\rThree Lines"
echo "Four Lines"

理想情况下,这将首先输出:
One Line
Two Lines

然后这个输出将被替换为

Three Lines
Four Lines

问题在于,虽然回车符可以让你覆盖一行输出,但是你无法通过\b跳过\n。那么如何覆盖多行呢?

1个回答

16

我找到了一个解决方案,需要进行一些挖掘,但我仍然不完全确定它是如何工作的。不过,似乎程序 "tput" 可以让您获取用于清除行和定位光标的特殊字符。具体而言,“tput el” 将清除当前行开头(而不仅仅重新定位光标)。方便地,“tput cuu1” 将把光标向上移动一行。因此,如果在你的bash脚本中声明变量,例如:

UPLINE=$(tput cuu1)
ERASELINE=$(tput el)
你可以这样编写脚本:

你可以这样编写脚本:

UPLINE=$(tput cuu1)
ERASELINE=$(tput el)
echo "One Line"
echo "Two Lines"
echo "$UPLINE$ERASELINE$UPLINE$ERASELINE\c"
echo "Three Lines"
echo "Four Lines"

然后你将会得到期望的输出。


我想评论一下,您可能需要在该行中使用选项-e:echo -e "$UPLINE$ERASELINE$UPLINE$ERASELINE\c"。而"\c"的意思是您删除了最后一个换行符或类似的内容;我怀疑这是bashism?无论如何,非常感谢您的答案,它非常有帮助! - Esmu Igors

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接