88

I know that I could delete the last three chars with:

echo -ne '\b\b\b'

But how can I delete a full line? I mean I don't want to use:

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'

...etc... to delete a long line.

Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
LanceBaynes
  • 40,135
  • 97
  • 255
  • 351

8 Answers8

160

You're looking for terminal escapes. In particular, to clear from the cursor position to the beginning of the line:

echo -e "\033[1K"

Or everything on the line, regardless of cursor position:

echo -e "\033[2K"

And you can do all sorts of other neat tricks with terminal escapes too.

Kevin
  • 40,767
  • 14
    This assumes a VT100-compatible terminal or emulator (which is a pretty safe assumption these days). – Keith Thompson Dec 12 '11 at 01:46
  • 3
    If you want to erase something you just echoed, your previous echo must have the -n flag, or you'll be sent to a new line – djjeck Nov 20 '14 at 01:45
  • 2
    If you want to write something else, on the line you're erasing, add a -n flag on the echo above, or else you'll go to a new line right after deleting it. Also, append a \r to the string above, or your new content won't go to the beginning of that line. – djjeck Nov 20 '14 at 01:46
  • -1 | -e as echo argument is not POSIX compliant + I don't like the escape sequences. Either prefer printf or tput. – Vlastimil Burián Feb 03 '18 at 10:23
  • @Vlastimil why would you downvote this? OP didn't ask for an answer that you would like. Maybe he should have precised that -e parameter for echo is not POSIX compliant but still... – souki May 21 '18 at 10:01
  • echo -ne "\033[2K\rFoobar" – pmiguelpinto90 Nov 02 '21 at 15:20
  • Another useful one is echo -e "\033[0K" which clears from the cursor to the end of the line. – Alex Henrie Sep 30 '22 at 16:27
68

You can use \b or \r to move the cursor back and then overwrite the printed character with a new character.

Note that neither \b nor \r deletes the printed characters. It just moves the cursor back. \b moves the cursor back one character and \r moves the cursor to the beginning of the line.

Example:

echo -e 'fooooo\b\b\b\bbar

will print

fobaro

while

echo -e 'fooooo\rbar'

will print:

barooo

If you want the previous characters "deleted" then you can use the following workaround:

echo -e 'fooooo\r      \rbar'

or

echo -e 'fooooo\rbar   '

(note the spaces after bar)

output:

bar   

note that there are now spaces after bar.

output with spaces highlighted

bar
   ^^^ spaces

for most use cases this will not matter. but if you, for example, modify background color you will notice the spaces.


Excerpt from 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.

Lesmana
  • 27,439
39

If you want to clear the line, then I suggest you use a combination of the carriage return people are mentioning and terminfo.

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

This will write xyzzyxyzzy, then return to the beginning of the line and send the "clear to end of line" sequence to the terminal, then write foobar. The -n makes echo not add a newline after the foobar.

Arcege
  • 22,536
14

Here's an example using echo's no newline -n and carriage return \r options.

bash overwrite terminal line

#!/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"
12

You explicitly ask for echo, but this request pins you down. Here's an approach that uses bash's builtin printf command with brace expansion:

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character
kojiro
  • 4,644
2

Here is a countdown timer example I use:

i=10
while [ $i -gt 0 ]; 
do 
  printf "$i seconds remaining       " && printf '\r\033[1B'
  i=`expr $i - 1`
  sleep 1
  printf '\033[1A'
done
Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
1

Instead of echo -en "\r" you might also find the printf "\r" command as useful. This way you can format the string. e.g.:

for sec in {1..100}; do printf "\r %04d" ${sec}; sleep 0.1; done

I usually do that as well when operating with slow file parsing to display the filename currently in progress without creating a list

McPeppr
  • 169
  • 2
    -1 | Maybe you wanted to intentionally make a one-liner, but that's actually only good for testing. I would re-write it properly with new lines. – Vlastimil Burián Feb 03 '18 at 08:05
0

As question is delete the full line

I have used below command with combination of echo and sed to delete line

After execution of command result will be empty.since while line will be replaced with none

command

echo  "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" | sed -r "s/.*//g"