วิธีการลบเส้นด้วยเสียงสะท้อน?


60

ฉันรู้ว่าฉันสามารถลบสามตัวอักษรสุดท้ายด้วย:

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'

... ฯลฯ ... เพื่อลบเส้นยาว


2
สำหรับผู้ที่ต้องการเขียนในบรรทัดเดียวกันอย่างต่อเนื่อง: echo -ne "\033[2K" ; printf "\r"ตอนนี้บรรทัดนั้นดีเหมือนใหม่ราวกับว่ามันไม่เคยเขียนมาก่อน
สวัสดีชาวโลก

2
echo -ne "\e[2K\r"ผมค่อนข้างมั่นใจว่าคุณก็สามารถใช้ แต่ ANSI escape sequences FTW ยังไงก็ตาม
คู่ปรับ Shot

คำตอบ:


57

คุณสามารถใช้\bหรือ\rเพื่อเลื่อนเคอร์เซอร์ไปด้านหลังจากนั้นเขียนทับอักขระที่พิมพ์ด้วยอักขระใหม่ โปรดทราบว่าจะไม่มี\bหรือ\rลบอักขระที่พิมพ์ออกมา มันแค่เลื่อนเคอร์เซอร์ไปด้านหลัง \bเลื่อนเคอร์เซอร์ไปที่อักขระหนึ่งตัวและ\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\rbarก้อง barooooooo
Mat

1
ใช่คุณถูก. โปรดทราบว่ายังก้องecho -e 'foooo\b\b\b\b\b\b\b\b\b\bbar' baroo
lesmana

printfดังนั้นหวานทำงานได้แม้ไม่มีที่ติใน
Michael-O

4
คำตอบที่ไม่ถูกต้องมาก สิ่งหนึ่งของ Kevin ดีกว่าจริงๆ
Mike Aski

87

คุณกำลังมองหาหนีขั้ว โดยเฉพาะเมื่อต้องการล้างจากตำแหน่งเคอร์เซอร์จนถึงจุดเริ่มต้นของบรรทัด:

echo -e "\033[1K"

หรือทุกอย่างในบรรทัดโดยไม่คำนึงถึงตำแหน่งเคอร์เซอร์:

echo -e "\033[2K"

และคุณสามารถทำกลอุบายอื่น ๆ ได้ทุกประเภทด้วยการหลบหนีจากสถานีด้วย


6
นี่ถือว่าเป็นเทอร์มินัลหรืออีมูเลเตอร์ที่เข้ากันได้กับ VT100 (ซึ่งเป็นข้อสันนิษฐานที่ปลอดภัยในทุกวันนี้)
Keith Thompson

2
หากคุณต้องการลบบางสิ่งที่คุณเพิ่งสะท้อนเสียงก้องก่อนหน้าของคุณจะต้องมีแฟ
ล็ก

1
หากคุณต้องการเขียนอย่างอื่นบนบรรทัดที่คุณลบให้เพิ่มแฟล็ก -n ที่ echo ด้านบนหรืออื่น ๆ คุณจะไปที่บรรทัดใหม่ทันทีหลังจากลบ นอกจากนี้ผนวก a \ r กับสตริงด้านบนไม่เช่นนั้นเนื้อหาใหม่ของคุณจะไม่ไปที่จุดเริ่มต้นของบรรทัดนั้น
djjeck

-1 | -eเนื่องจากechoอาร์กิวเมนต์ไม่สอดคล้องกับ POSIX + ฉันไม่ชอบลำดับการหลีกเลี่ยง ไม่ว่าจะชอบหรือprintf tput
LinuxSecurityFreak

@Vastastil ทำไมคุณต้องลงคะแนนนี้ OP ไม่ได้ขอคำตอบที่คุณต้องการ บางทีเขาควรจะคิดว่า-eพารามิเตอร์สำหรับechoไม่เป็นไปตาม POSIX แต่ยัง ...
souki

35

หากคุณต้องการที่จะล้างบรรทัดแล้วฉันขอแนะนำให้คุณใช้การรวมกันของคนรับคืนรถกำลังพูดถึงและ terminfo

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

นี้จะเขียนxyzzyxyzzyแล้วกลับไปที่จุดเริ่มต้นของบรรทัดและส่ง "ที่ชัดเจนในการสิ้นสุดของบรรทัด" foobarลำดับไปยังสถานีแล้วเขียน ทำให้ก้องไม่เพิ่มขึ้นบรรทัดใหม่หลังจากที่-nfoobar


4
ฉันชอบส่วนของการพิสูจน์อักษรในอนาคตของโซลูชันนี้โดยเฉพาะ - การใช้ tput อาจหมายถึงว่ามันจะทำงานบนเทอร์มินัลชนิดใดก็ได้
Amos Shapira

2
ดีกว่าprintf '%s\r%s%s' xyzzyxyzzy "$ceol" foobarสำหรับการพกพาและเพื่อหลีกเลี่ยงเนื้อหาที่$ceolต้องผ่าน\xการขยายตัว
Stéphane Chazelas

คำตอบที่ดีที่สุดถ้าเพียงเพราะมันทำงานกับสายยาวโดยพลการ ขอบคุณ!
กราฟิลส์

ทำงานได้อย่างสมบูรณ์แบบ แต่ถ้าฉันปรับขนาดหน้าจอเทอร์มินัลเล็กกว่าบรรทัดเอาท์พุท
K.Sopheak

11

คุณขออย่างชัดเจนechoแต่คำขอนี้ทำให้คุณผิดหวัง นี่คือวิธีการที่ใช้printfคำสั่งbuiltin ของ bash พร้อมกับการขยายรั้ง:

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

1
ที่สมบูรณ์แบบ! สิ่งที่ฉันต้องการ
Omar S.

2
printf 'สถานะ: เริ่มต้น'; sleep 2s; printf '\ r'; printf 'สถานะ: อัพเดท'; sleep 2s; printf '\ r';
Omar S.

4

นี่คือตัวอย่างการใช้ echo ไม่มี ตัวเลือกnewline-nและcarriage return \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 ดีสำหรับการแก้ไขสคริปต์ของฉันอย่างหมดจด
oneindelijk

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.