我知道我可以删除最后三个字符:
echo -ne '\b\b\b'
但如何删除整行呢?我的意思是我不想使用:
echo -ne '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b'
...等等...删除长行。
答案1
您正在寻找终端逃逸。特别是要清除从光标位置到行首的内容:
echo -e "\033[1K"
或线上的所有内容,无论光标位置如何:
echo -e "\033[2K"
您还可以使用终端转义来执行各种其他巧妙的技巧。
答案2
您可以使用\b
或\r
移动光标返回,然后用新字符覆盖打印的字符。
请注意,既不删除\b
也不\r
删除打印的字符。它只是将光标向后移动。\b
将光标向后移动一个字符并将\r
光标移动到行首。
例子:
echo -e 'fooooo\b\b\b\bbar
将打印
fobaro
尽管
echo -e 'fooooo\rbar'
将打印:
barooo
如果您希望“删除”以前的字符,则可以使用以下解决方法:
echo -e 'fooooo\r \rbar'
或者
echo -e 'fooooo\rbar '
(注意栏后的空格)
输出:
bar
请注意,小节后面现在有空格。
输出突出显示空格
bar
^^^ spaces
对于大多数用例来说,这并不重要。但是,例如,如果您修改背景颜色,您会注意到空格。
摘自man echo
:
If -e is in effect, the following sequences are recognized:
\0NNN the character whose ASCII code is NNN (octal)
\\ backslash
\a alert (BEL)
\b backspace
\c produce no further output
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
NOTE: your shell may have its own version of echo, which usually super‐
sedes the version described here. Please refer to your shell's docu‐
mentation for details about the options it supports.
答案3
如果您想清除该行,那么我建议您使用人们提到的回车符和 terminfo 的组合。
# terminfo clr_eol
ceol=$(tput el)
echo -ne "xyzzyxyzzy\r${ceol}foobar"
这将写入xyzzyxyzzy
,然后返回到行的开头并将“清除到行尾”序列发送到终端,然后写入foobar
。使-n
echo 不在 后添加换行符foobar
。
答案4
你明确要求echo
,但这个要求却让你束手无策。这是一种使用 bash 内置printf
命令和大括号扩展的方法:
printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character