web-dev-qa-db-ja.com

エコーで行を削除する方法は?

私は最後の3文字を次のように削除できることを知っています:

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'

...など...長い行を削除します。

66
LanceBaynes

\bまたは\rを使用してカーソルを戻し、印刷された文字を新しい文字で上書きできます。 \b\rも印刷された文字を削除しないことに注意してください。カーソルを戻すだけです。 \bはカーソルを1文字戻し、\rはカーソルを行の先頭に移動します。

例:両方

echo -e 'foooo\b\b\b\b\bbar'

そして

echo -e 'foooo\rbar'

印刷されます:

baroo

文字を削除したい場合は、次の回避策を使用する必要があります。

echo -e 'fooooo\r     \rbar'

出力:

bar  

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.
57
lesmana

ターミナルエスケープ を探しています。特に、カーソル位置から行の先頭までをクリアするには:

echo -e "\033[1K"

または、カーソルの位置に関係なく、行のすべて:

echo -e "\033[2K"

また、ターミナルエスケープを使用して、他のあらゆる種類の巧妙なトリックを実行することもできます。

100
Kevin

行をクリアしたい場合は、人々が言及している改行とterminfoの組み合わせを使用することをお勧めします。

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

これはxyzzyxyzzyを書き込んでから、行の先頭に戻り、「行末までクリア」シーケンスを端末に送信してから、foobarを書き込みます。 -nは、echoがfoobarの後に改行を追加しないようにします。

36
Arcege

あなたは明示的にechoを要求しますが、この要求はあなたを固定します。 bashの組み込みprintfコマンドとブレース展開を使用するアプローチは次のとおりです。

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character
11
kojiro

エコーのno newline-nおよび復帰\rオプション。

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"
7
Derek Soike

echo -en "\r"の代わりに、printf "\r"コマンドも役立つかもしれません。この方法で文字列をフォーマットできます。例えば。:

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

私は通常、リストを作成せずに現在進行中のファイル名を表示するために遅いファイル解析で操作するときにもそれを行います

1
McPeppr

質問は完全な行を削除することなので

以下のコマンドをechosedを組み合わせて使用​​して、行を削除しました

コマンドの実行後、結果は空になります。

コマンド

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"
0