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


60

私は最後の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'

... etc ...長い行を削除します。


2
同じ行に継続的に書き込みたい場合:echo -ne "\033[2K" ; printf "\r"、今ではその行は以前とはまったく書かれていないかのように、新しいようになりました。
ハローワールド

2
使用できると確信していますecho -ne "\e[2K\r"。しかし、それでもANSIエスケープシーケンスFTW。
パルティアショット

回答:


57

\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.

4
はい、しかしecho -e 'fooooooooo\rbarbaroooooooをエコーし​​ます。
マット

1
はい、あなたは正しいです。echo -e 'foooo\b\b\b\b\b\b\b\b\b\bbar'エコーもすることに注意してくださいbaroo
レスマナ

とても甘い、でさえ完璧に動作しprintfます。
マイケルO

4
非常に不正確な答え。ケビンのものは本当に良いです
マイクAski

87

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

echo -e "\033[1K"

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

echo -e "\033[2K"

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


6
これは、VT100互換の端末またはエミュレーターを前提としています(最近ではかなり安全な前提です)。
キーストンプソン

2
あなたはあなただけの反響何かを消去したい場合は、あなたの前のエコーは、-nフラグを持っている必要があります、またはあなたは、新しい行に送られます
djjeck

1
他の何かを書きたい場合は、消去している行に、上のエコーに-nフラグを追加します。そうしないと、削除した直後に新しい行に移動します。また、上記の文字列に\ rを追加しないと、新しいコンテンツがその行の先頭に移動しません。
djjeck 14年

-1 | 引数は準拠した+をPOSIXされていない私は、エスケープシーケンスを好きではありません。優先するまたは。-eechoprintftput
LinuxSecurityFreak

@Vlastimilなぜこれをダウン票するのですか?OPはあなたが望む答えを求めませんでした。たぶん彼はそれをprecisedたはず-eのパラメータは、echoPOSIX準拠が、まだ...されていません
souki

35

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

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

これは、書き込みxyzzyxyzzy、行の先頭に戻り、「行の終わりまでクリア」シーケンスを端末に送信し、書き込みfoobarます。は-n、エコーの後に改行を追加しませんfoobar


4
この特定のソリューションの将来を保証する部分が好きです-tputを使用することは、おそらくあらゆる種類の端末で動作することを意味します。
アモスシャピラ14年

2
より良いprintf '%s\r%s%s' xyzzyxyzzy "$ceol" foobar移植のためのコンテンツを避けるために$ceol経由する\x展開を。
ステファンシャゼル16年

それが勝手に長い行で動作するという理由だけで最高の答え。ありがとう!
ラファエル

完璧に動作します。しかし、出力行よりも小さい端末画面のサイズを変更すると、面倒になります。
K.Sopheak

11

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

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

1
完璧!まさに私が必要なもの
オマールS.

2
printf 'Status:started'; sleep 2s; printf '\ r'; printf 'Status:updated'; sleep 2s; printf '\ r';
オマールS.

4

次に、エコーの改行なし オプション-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"

チェックマークはRHEL6でも機能します。私のスクリプトの純粋に美的な編集に
最適

1

代わりにecho -en "\r"、このprintf "\r"コマンドが便利だと思うかもしれません。これにより、文字列をフォーマットできます。例えば:

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

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


-1 | 意図的にワンライナーを作成したかったかもしれませんが、実際にはそれはテストにのみ適しています。新しい行で適切に書き直します。
LinuxSecurityFreak

0

質問は行全体を削除することです

私はの組み合わせを指定して、コマンドの下に使用しているechoと、sed行を削除します

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

コマンド

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"

-1

以下は、私が使用するカウントダウンタイマーの例です。

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

-1 | 意図的にワンライナーを作成したかったかもしれませんが、実際にはそれはテストにのみ適しています。新しい行で適切に書き直します。
LinuxSecurityFreak

次に、先に進んで、新しい答えを追加します。または私の答えの編集を提案してください。
mikiemorales
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.