如何用回声删除行?

Lan*_*nes 74 command-line echo

我知道我可以删除最后三个字符:

echo -ne '\b\b\b'
Run Code Online (Sandbox Code Playgroud)

但是如何删除整行?我的意思是我不想使用:

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'
Run Code Online (Sandbox Code Playgroud)

...等...删除长行。

Kev*_*vin 130

您正在寻找终端转义。特别是,从光标位置清除到行首:

echo -e "\033[1K"
Run Code Online (Sandbox Code Playgroud)

或者行上的所有内容,无论光标位置如何:

echo -e "\033[2K"
Run Code Online (Sandbox Code Playgroud)

你也可以用终端转义来做各种其他巧妙的技巧。

  • 这假设了一个兼容 VT100 的终端或模拟器(现在这是一个非常安全的假设)。 (12认同)
  • 如果你想删除你刚刚回显的内容,你之前的回显必须有 -n 标志,否则你将被发送到一个新行 (3认同)
  • 如果你想写别的东西,在你要删除的行上,在上面的 echo 上添加一个 -n 标志,否则你会在删除它后立即转到新行。另外,请将 \r 附加到上面的字符串,否则您的新内容将不会到达该行的开头。 (2认同)

les*_*ana 64

您可以使用\b\r光标移回,然后用新字符覆盖打印的字符。请注意,既不\b也不\r删除打印的字符。它只是将光标移回。\b将光标向后移动一个字符并将\r光标移动到行首。

示例:两者

echo -e 'foooo\b\b\b\b\bbar'
Run Code Online (Sandbox Code Playgroud)

echo -e 'foooo\rbar'
Run Code Online (Sandbox Code Playgroud)

将打印:

baroo
Run Code Online (Sandbox Code Playgroud)

如果要删除字符,则必须使用以下解决方法:

echo -e 'fooooo\r     \rbar'
Run Code Online (Sandbox Code Playgroud)

输出:

bar  
Run Code Online (Sandbox Code Playgroud)

摘自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.
Run Code Online (Sandbox Code Playgroud)

  • 很不准确的回答。凯文的一个真的更好 (10认同)
  • 是的,但是 `echo -e 'foooooooooo\rbar` 与 barooooooo 相呼应。 (4认同)

Arc*_*ege 37

如果你想清除行,那么我建议你使用回车的组合人提和terminfo。

# terminfo clr_eol
ceol=$(tput el)
echo -ne "xyzzyxyzzy\r${ceol}foobar"
Run Code Online (Sandbox Code Playgroud)

这将写入xyzzyxyzzy,然后返回到行首并将“清除到行尾”序列发送到终端,然后写入foobar。在-n之后的品牌回声无法添加新行foobar

  • 我喜欢这个特定解决方案的面向未来的部分 - 使用 tput 可能意味着它可以在任何类型的终端上工作。 (4认同)
  • 与 `printf '%s\r%s%s' xyzzyxyzzy "$ceol" foobar` 一样更好,以实现可移植性并避免让 `$ceol` 的内容通过 `\x` 扩展。 (2认同)

koj*_*iro 12

您明确要求echo,但这个要求让您失望。这是一种使用printf带有大括号扩展的bash 内置命令的方法:

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character
Run Code Online (Sandbox Code Playgroud)

  • printf '状态:开始';睡眠 2s;printf '\r';printf '状态:更新';睡眠 2s;printf '\r'; (2认同)

小智 11

这是一个使用 echo 的无换行 -n回车 \r选项的示例。

bash 覆盖终端线

#!/bin/bash

CHECK_MARK="\033[0;32m\xE2\x9C\x94\033[0m"

echo -e "\n\e[4mDoing Things\e[0m"
echo -n "doing thing 1..."
sleep 1
echo -e "\\r${CHECK_MARK} thing 1 done"
Run Code Online (Sandbox Code Playgroud)

  • 复选标记甚至在 RHEL6 上也有效。非常适合对我的脚本进行纯粹的美学编辑 (2认同)