इको के साथ लाइन कैसे डिलीट करें?


59

मुझे पता है कि मैं पिछले तीन वर्णों को हटा सकता हूं:

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"। लेकिन एएनएसआई ने एफटीडब्ल्यू, फिर भी अनुक्रम से बच निकलता है।
पार्थियन शॉट

जवाबों:


56

आप कर्सर को वापस ले जाने के लिए उपयोग कर सकते हैं \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ईरो बोरोवो।
Mat

1
हाँ आप सही है। ध्यान दें कि echo -e 'foooo\b\b\b\b\b\b\b\b\b\bbar'गूँज भी baroo
lesmana

इतना मीठा, इसमें भी दोषहीन काम करता है printf
माइकल-ओ

4
बहुत गलत जवाब। केविन एक वास्तव में बेहतर है
माइक अस्सी

87

आप टर्मिनल से बच निकले हैं । विशेष रूप से, कर्सर की स्थिति से पंक्ति की शुरुआत तक स्पष्ट करने के लिए:

echo -e "\033[1K"

या कर्सर की स्थिति की परवाह किए बिना लाइन पर सब कुछ:

echo -e "\033[2K"

और आप टर्मिनल एस्केप के साथ अन्य प्रकार के अन्य स्वच्छ चाल भी कर सकते हैं।


6
यह एक VT100- संगत टर्मिनल या एमुलेटर (जो इन दिनों एक बहुत ही सुरक्षित धारणा है) को मानता है।
कीथ थॉम्पसन

2
यदि आप किसी ऐसी चीज को मिटाना चाहते हैं जिसे आपने प्रतिध्वनित किया है, तो आपकी पिछली प्रतिध्वनि में एक ध्वज होना चाहिए, या आपको एक नई पंक्ति में भेजा जाएगा
djjeck

1
यदि आप कुछ और लिखना चाहते हैं, तो आप जिस लाइन को मिटा रहे हैं, उस पर एक ईओ फ्लैग को ऊपर से जोड़ दें, या फिर आप उसे हटाने के ठीक बाद एक नई लाइन पर जाएंगे। इसके अलावा, ऊपर दिए गए स्ट्रिंग में एक \ r संलग्न करें, या आपकी नई सामग्री उस पंक्ति की शुरुआत में नहीं जाएगी।
djjeck

-1 | तर्क के -eरूप में echoPOSIX का अनुपालन नहीं है + मुझे पलायन अनुक्रम पसंद नहीं है। या तो पसंद करते हैं printfया tput
LinuxSecurityFreak

@ Vlastimil आप इसे क्यों कम करेंगे? ओपी ने ऐसा जवाब नहीं मांगा जो आप चाहें। हो सकता है कि उन्होंने यह मान लिया हो कि -eपैरामीटर echoपोसिक्स के अनुरूप नहीं है, लेकिन फिर भी ...
सूकी

35

यदि आप लाइन को खाली करना चाहते हैं, तो मेरा सुझाव है कि आप गाड़ी वापसी के उन लोगों के संयोजन का उपयोग करें जिनका लोग उल्लेख कर रहे हैं और टर्मऑफ़।

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

यह लिखेगा xyzzyxyzzy, फिर लाइन की शुरुआत में वापस आ जाएगा और टर्मिनल पर "लाइन के अंत के लिए स्पष्ट" अनुक्रम भेज देगा, फिर लिखें foobar-nबनाता है के बाद एक नई पंक्ति जोड़ नहीं गूंज foobar


4
मुझे इस विशिष्ट समाधान के भविष्य-प्रूफिंग भाग की तरह पसंद है - संभवतः tput का उपयोग करने का मतलब है कि यह किसी भी तरह के टर्मिनल पर काम करेगा।
अमोस शापिरा

2
printf '%s\r%s%s' xyzzyxyzzy "$ceol" foobarपोर्टेबिलिटी के लिए बेहतर है और विस्तार $ceolसे गुजरने की सामग्री से बचने के लिए \x
स्टीफन चेज़लस

सबसे अच्छा जवाब केवल अगर यह मनमाने ढंग से लंबी लाइनों के साथ काम करता है। धन्यवाद!
राफेल

सही काम करते हैं। लेकिन अगर मैं टर्मिनल स्क्रीन को आउटपुट लाइन से छोटा करता हूं, तो यह गड़बड़ हो जाती है।
के.एस.फोक

11

आप स्पष्ट रूप से पूछते हैं echo, लेकिन यह अनुरोध आपको नीचे गिराता है। यहाँ एक दृष्टिकोण है जो बश के अंतर्निहित printfविस्तार के साथ बैश की कमांड का उपयोग करता है :

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

1
उत्तम! वास्तव में मुझे क्या चाहिए
उमर एस।

2
प्रिंटफ 'स्टेटस: शुरू'; स्लीप 2 एस; प्रिंटफ '' आर '; प्रिंटफ' स्टेटस: अपडेटेड '; स्लीप 2 एस; प्रिंटफ' 'आर';
उमर एस।

4

यहां एक उदाहरण है इको की नो न्यूलाइन -n और कैरिज रिटर्न \r विकल्प।

बैश ओवरराइट टर्मिनल लाइन

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

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 8

फिर, आगे बढ़ें और इसे करें और एक नया उत्तर जोड़ें। या मेरे उत्तर के संपादन का प्रस्ताव रखें।
mikiemorales
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.