প্রতিধ্বনির সাহায্যে লাইনটি কীভাবে মুছবেন?


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"। তবে এএনএসআই এস্কেপ সিকোয়েন্সগুলি এফটিডাব্লু, তবুও।
পার্থিয়ান শট

উত্তর:


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বারোওও প্রতিধ্বনি দেয়।
মাদুর

1
হ্যাঁ তুমিই ঠিক. নোট যে echo -e 'foooo\b\b\b\b\b\b\b\b\b\bbar'প্রতিধ্বনিত baroo
লেসমানা

তাই মিষ্টি, এমনকি নির্দোষভাবে কাজ করে printf
মাইকেল-ও

4
খুব অসম্পূর্ণ উত্তর। কেভিনের একজন সত্যিই ভাল
মাইক আসকি

87

আপনি টার্মিনাল পলায়ন খুঁজছেন । বিশেষত, কার্সারের অবস্থান থেকে রেখার শুরু পর্যন্ত সাফ করা:

echo -e "\033[1K"

বা কার্সারের অবস্থান নির্বিশেষে লাইনের সমস্ত কিছু:

echo -e "\033[2K"

এবং আপনি টার্মিনাল পলায়নের সাথে অন্যান্য ঝরঝরে কৌশলগুলিও করতে পারেন।


6
এটি একটি ভিটি 100- সামঞ্জস্যপূর্ণ টার্মিনাল বা এমুলেটর ধরে নিয়েছে (যা আজকাল বেশ নিরাপদ অনুমান)।
কিথ থমসন

2
আপনি যদি কেবল কিছু প্রতিধ্বনিত কিছু মুছে ফেলতে চান তবে আপনার আগের প্রতিধ্বনিতে অবশ্যই
পতাকাচিহ্ন

1
আপনি যে লাইনে মুছে ফেলছেন তাতে যদি আপনি অন্য কিছু লিখতে চান তবে উপরের প্রতিধ্বনিতে একটি -n পতাকা যুক্ত করুন, অন্যথায় আপনি মুছে ফেলার পরে একটি নতুন লাইনে চলে যাবেন। এছাড়াও, উপরের স্ট্রিংটিতে একটি \ r যুক্ত করুন, বা আপনার নতুন সামগ্রীটি এই লাইনের শুরুতে যাবে না।
djjeck

-1 | -eযেমন echoযুক্তি POSIX নয় অনুবর্তী আমি পালাবার ক্রম পছন্দ করি না। হয় পছন্দ করুন printfবা tput
লিনাক্সসিকিউরিটিফ্রেক

পছন্দ করেছেন ওপি আপনার পছন্দ মতো কোনও উত্তর চায় নি। হতে পারে তার স্পষ্ট করে জানা উচিত ছিল যে -eপ্যারামিটারটি echo
পসিক্সের সাথে

35

আপনি যদি লাইনটি সাফ করতে চান, তবে আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি গাড়ীর ফেরতের লোকেরা উল্লেখ করছেন এবং টার্মিনো দিয়েছিলেন তার সংমিশ্রণটি ব্যবহার করুন।

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

এটি লিখবে xyzzyxyzzy, তারপরে লাইনের শুরুতে ফিরে আসবে এবং "ক্লিয়ার টু লাইনের শেষ" ক্রমটি টার্মিনালে প্রেরণ করবে, তারপরে লিখবে foobar। এর -nপরে ইকো কোনও নতুন লাইন যুক্ত করে না foobar


4
আমি এই নির্দিষ্ট সমাধানটির ভবিষ্যত-প্রুফিং অংশটি পছন্দ করি - টিপুট ব্যবহারের অর্থ সম্ভবত এটি কোনও ধরণের টার্মিনালটিতে কাজ করবে।
আমোস শাপিরা

2
printf '%s\r%s%s' xyzzyxyzzy "$ceol" foobarবহনযোগ্যতার জন্য এবং প্রসারণের $ceolমধ্য দিয়ে যাওয়ার সামগ্রী এড়ানো ভাল avoid \x
Stéphane Chazelas

সেরা উত্তর যদি তা নির্বিচারে দীর্ঘ লাইনের সাথে কাজ করে। ধন্যবাদ!
রাফেল

নিখুঁত কাজ তবে যদি আমি আউটপুট লাইনের চেয়ে টার্মিনাল স্ক্রিনটিকে আকার পরিবর্তন করি তবে তা অগোছালো হয়ে যায়।
কে.সোফিয়াক

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 এও কাজ করে। আমার স্ক্রিপ্টগুলির নিখুঁত নান্দনিক সম্পাদনার জন্য দুর্দান্ত
oneindelijk

1

আপনার পরিবর্তে কমান্ডটি দরকারী echo -en "\r"হিসাবেও পেতে পারেন printf "\r"। এইভাবে আপনি স্ট্রিংটি ফর্ম্যাট করতে পারেন। উদাহরণ:

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

তালিকা তৈরি না করে বর্তমানে চলমান ফাইলের নামটি প্রদর্শন করতে ধীর ফাইল পার্সিংয়ের সাথে অপারেটিং করার সময় আমি সাধারণত এটি করি usually


-1 | সম্ভবত আপনি ইচ্ছাকৃতভাবে একটি ওয়ান-লাইনার তৈরি করতে চেয়েছিলেন, তবে এটি কেবল পরীক্ষার জন্য ভাল। আমি নতুন লাইন দিয়ে এটি আবার লিখতে হবে।
লিনাক্সসিকিউরিটিফ্রেক

0

প্রশ্নটি পুরো লাইনটি মুছবে

আমি সমন্বয় সঙ্গে কমান্ড নিচে ব্যবহার করেছেন echoএবং sedলাইন মুছে ফেলতে

কমান্ড কার্যকর করার পরে ফলাফল খালি হবে ince তবে লাইনটি কোনওটির সাথে প্রতিস্থাপন করা হবে

হুকুম

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 | সম্ভবত আপনি ইচ্ছাকৃতভাবে একটি ওয়ান-লাইনার তৈরি করতে চেয়েছিলেন, তবে এটি কেবল পরীক্ষার জন্য ভাল। আমি নতুন লাইন দিয়ে এটি আবার লিখতে হবে।
লিনাক্সসিকিউরিটিফ্রেক

তারপরে, এগিয়ে যান এবং এটি করুন এবং একটি নতুন উত্তর যুক্ত করুন। অথবা আমার উত্তরটির সম্পাদনার প্রস্তাব দিন।
মিকিমোরালেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.