Yankı ile satır silmek nasıl?


60

Son üç karakteri silebileceğimi biliyorum:

echo -ne '\b\b\b'

Ancak tam bir satırı nasıl silebilirim? Yani kullanmak istemiyorum:

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'

... vb ... uzun bir çizgiyi silmek için.


2
Sürekli aynı satırda yazmak isteyenler için: echo -ne "\033[2K" ; printf "\r"şimdi satır daha önce hiç yazmamış gibi yeni.
Merhaba Dünya

2
Sadece kullanabileceğinden eminim echo -ne "\e[2K\r". Ancak yine de ANSI kaçış dizileri FTW'yi diziyor.
Parthian Shot

Yanıtlar:


57

İmleci geri hareket ettirmek ve sonra yazdırılan karakterin üzerine yeni bir karakter yazmak için \bveya \rtuşunu kullanabilirsiniz . Yazdırılan karakterlerin ne silinmediğini ne de silmediğini unutmayın . Sadece imleci geriye doğru hareket ettirir. imleci bir karakter geriye hareket ettirir ve imleci satırın başına getirir.\b\r\b\r

Örnek: ikisi de

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

ve

echo -e 'foooo\rbar'

yazdıracak:

baroo

Karakterlerin silinmesini istiyorsanız, aşağıdaki geçici çözümü kullanmanız gerekir:

echo -e 'fooooo\r     \rbar'

çıktı:

bar  

Şundan alıntı 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
Evet, ama echo -e 'fooooooooo\rbarbarooooooo yankılanıyor.
Mat

1
Evet haklısın. Not echo -e 'foooo\b\b\b\b\b\b\b\b\b\bbar'ayrıca yankıları baroo.
lesmana

Çok tatlı, kusursuz bir şekilde çalışıyor printf.
Michael-O,

4
Çok yanlış cevap. Kevin'ın biri gerçekten daha iyi
Mike Aski

87

Terminal kaçışlarını arıyorsunuz . Özellikle, imleç konumundan satırın başlangıcına kadar temizlemek için:

echo -e "\033[1K"

Veya imleç konumundan bağımsız olarak satırdaki her şey:

echo -e "\033[2K"

Ayrıca terminal kaçışlarıyla her çeşit başka düzgün numaralar yapabilirsiniz.


6
Bu, VT100 uyumlu bir terminal veya emülatör varsayar (bugünlerde oldukça güvenli bir varsayımdır).
Keith Thompson

2

1
Başka bir şey yazmak istiyorsanız, sildiğiniz satıra, yukarıdaki yankıya -n bayrağı ekleyin, yoksa silmeden hemen sonra yeni bir satıra gidersiniz. Ayrıca, yukarıdaki dizeye bir tane ekleyin, yoksa yeni içeriğiniz bu satırın başına gitmez.
djjeck

-1 | -eolarak echoargüman uyumlu + POSIX değil ben çıkış sıralarını sevmiyorum. Ya tercih edin printfya da tput.
LinuxSecurityFreak,

@Vlastimil bunu neden reddedin? OP, istediğiniz bir cevap istemedi. Belki de -eparametresinin echoPOSIX uyumlu değil ama yine de ...
souki

35

Çizgiyi temizlemek istiyorsanız, bahsettiğiniz ve iade ettiğiniz kişilerin vagonlarının bir kombinasyonunu kullanmanızı öneririm.

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

Bu yazacak xyzzyxyzzy, sonra satırın başına dönecek ve "satırın sonuna kadar temizle" sırasını terminale gönderecek, sonra yazacaktır foobar. -nMarkaları sonra bir yeni satır eklemeyin yankı foobar.


4
Bu özel çözümün geleceğe dönük bir parçası türünü severim - tput kullanmak muhtemelen her türlü terminalde çalışacağı anlamına gelir.
Amos Shapira

2
Olarak daha iyi printf '%s\r%s%s' xyzzyxyzzy "$ceol" foobartaşınabilirlik için ve içeriğini zorunda kalmamak için $ceolgeçiyor \xgenişleme.
Stéphane Chazelas,

En iyi cevap, yalnızca keyfi olarak uzun çizgilerle çalıştığı için. Teşekkürler!
Raphael,

Mükemmel çalış Ancak terminal ekranını çıktı satırından daha küçük boyutlandırırsam, dağınık hale gelir.
K.Sopheak

11

Açıkça soruyorsun echoama bu istek seni alt ediyor İşte bash'ın yerleşik printfkomutunu ayraç genişletme ile kullanan bir yaklaşım :

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

1
mükemmel! tam ihtiyacım olanı
Omar S.

2
printf 'Durum: başladı'; 2s uyku; printf '\ r'; printf 'Durum: güncellendi'; uyku 2s; printf '\ r';
Omar S.

4

İşte yankı, yeni satır yok -n ve satır başı \r seçeneklerini kullanan bir örnek .

bash üzerine yaz terminali

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

Onay işareti RHEL6'da bile çalışır. Benim script tamamen estetik düzenlemeler için güzel
oneindelijk

1

Bunun yerine echo -en "\r", printf "\r"komutu da faydalı olarak bulabilirsiniz . Bu şekilde dizeyi biçimlendirebilirsiniz. Örneğin:

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

Bunu genellikle yavaş dosya ayrıştırma ile çalışırken, devam etmekte olan bir liste oluşturmadan devam eden dosya adını görüntülemek için de yapıyorum.


-1 | Belki bilerek tek bir astar yapmak istediniz, ama bu aslında sadece test için iyi. Düzgünce yeni satırlarla tekrar yazardım.
LinuxSecurityFreak,

0

Soru tam çizgi silmek gibi

Ben kombinasyonu ile komuta altında kullanmış echove sedçizgiyi silmek

Komut sonucu çalıştırıldıktan sonra boş olacaktır.

komuta

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

İşte kullandığım bir geri sayım sayacı örneği:

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 | Belki bilerek tek bir astar yapmak istediniz, ama bu aslında sadece test için iyi. Düzgünce yeni satırlarla tekrar yazardım.
LinuxSecurityFreak,

Ardından devam edin ve yapın ve yeni bir cevap ekleyin. Veya cevabım için bir düzenleme önerin.
mikiemorales
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.