পাঠ্য স্ট্রিম থেকে এএনএসআই রঙের কোডগুলি সরানো হচ্ছে


73

থেকে আউটপুট পরীক্ষা করা হচ্ছে

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'

একটি পাঠ্য সম্পাদকে (যেমন, vi) নিম্নলিখিতটি দেখায়:

^[[37mABC
^[[0m

আউটপুট ফাইল থেকে কীভাবে একজন এএনএসআই রঙের কোডগুলি সরিয়ে ফেলবে? আমি মনে করি সর্বোত্তম উপায় হ'ল প্রকারের স্ট্রিম এডিটরের মাধ্যমে আউটপুটটি পাইপ করা।

নিম্নলিখিত কাজ করে না

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'

প্রশ্নের উত্তর নয়, তবে আপনি আউটপুটটি পাইপ করতে পারেন moreবা less -Rযা কোনও টেক্সট সম্পাদকের পরিবর্তে এস্কেপ কোডগুলি রঙ হিসাবে ব্যাখ্যা করতে পারে।
টার্ডন

উত্তর:


97

অক্ষর ^[[37mএবং ^[[0mঅংশ ANSI পালাবার ক্রম (সিএসআই কোড)এই স্পেসিফিকেশন এছাড়াও দেখুন ।

জিএনইউ ব্যবহার করা হচ্ছে sed

sed 's/\x1b\[[0-9;]*m//g'
  • \x1b(বা \x1B) হ'ল পালানো বিশেষ চরিত্র
    ( sedবিকল্পগুলি সমর্থন করে না \eএবং \033)
  • \[ পলায়ন ক্রমের দ্বিতীয় চরিত্র
  • [0-9;]* রঙ মান (গুলি) রেজেেক্স
  • m অব্যাহতি ক্রমের শেষ চরিত্র

⚠ MacOS উপর, ডিফল্ট sedকমান্ড মত বিশেষ অক্ষর সমর্থন করে না \eযেমন সেই বিষয়টিই তুলে ধরেছিলেন SLM এবং steamer25 মন্তব্য। পরিবর্তে gsedআপনি ব্যবহার করে ইনস্টল করতে পারেন তা ব্যবহার করুন brew install gnu-sed

ওপির কমান্ড লাইনের উদাহরণ:   (ওপি অর্থ আসল পোস্টার)

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
      sed 's/\x1b\[[0-9;]*m//g'

টম হেল গ্রাফিক্স মোডের (বর্ণ) এস্কেপ ক্রমের নির্দিষ্ট [a-zA-Z]বর্ণের পরিবর্তে অন্যান্য সমস্ত পালানোর ক্রম সরিয়ে ফেলার পরামর্শ দেয় m। তবে [a-zA-Z]এটি খুব প্রশস্ত হতে পারে এবং খুব বেশি মুছে ফেলতে পারে। মিশা ফালেস্কি এবং মিগুয়েল মোটা যথাক্রমে [mGKH]এবং [mGKF]যথাক্রমে কেবলমাত্র কয়েকটি পালানোর ক্রম সরিয়ে দেওয়ার প্রস্তাব রাখে । ত্রুটি / সতর্কতা থেকে রঙগুলি অপসারণ করার পাশাপাশি ব্রিটটন ক্যারিন ইঙ্গিতও Kকরতে হবে (পুনর্নির্দেশ করতে ভুলবেন না )।mgccgcc 2>&1 | sed...

sed 's/\x1b\[[0-9;]*m//g'           # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'    # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g'      # Remove color and move sequences
Last escape
sequence
character   Purpose
---------   -------------------------------
m           Graphics Rendition Mode (including Color)
G           Horizontal cursor move
K           Horizontal deletion
H           New cursor position
F           Move cursor to previous n lines

ব্যবহার perl

sedকিছু অপারেটিং সিস্টেমে ইনস্টল করা সংস্করণ সীমিত হতে পারে (যেমন ম্যাকোস)। কমান্ডটি perlআরও অপারেটিং সিস্টেমে সাধারণত ইনস্টল / আপডেট করা সহজ হওয়ার সুবিধা দেয়। আদম কাট্স ব্যবহার করতে প্রস্তাব দেওয়া \e(একই হিসাবে \x1b) এ PCRE

আপনি কমান্ডগুলি ফিল্টার করতে চান তার উপর নির্ভর করে আপনার রেজেক্সটি চয়ন করুন:

perl -pe 's/\e\[[0-9;]*m//g'          # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick

ওপির কমান্ড লাইনের উদাহরণ:

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
      | perl -pe 's/\e\[[0-9;]*m//g'

ব্যবহার

স্টুয়ার্ট কার্ডাল এর মন্তব্য দ্বারা ইঙ্গিত হিসাবে , এই sedকমান্ড লাইন প্রকল্প চূড়ান্ত Nginx ব্যাড বট (1000 তারা) ইমেইল রিপোর্ট পরিষ্কার করতে ব্যবহার করে ;-)


2
sedকমান্ড এবং ব্যাখ্যা জন্য ধন্যবাদ । :)
রেডসান্দ্রো

2
কিছু রঙের কোডগুলিতে (যেমন লিনাক্স টার্মিনাল) একটি উপসর্গ থাকে, যেমন আপনার রেজেক্সে 1;31mআরও ভাল যোগ করুন ;: cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'বা সেগুলি ছিনিয়ে নেওয়া হবে না।
রেডসান্দ্রো

1
এটি ইমেল প্রতিবেদনটি পরিষ্কার করতে github.com/mitchellkrogza/nginx-ultimate-bad-bot- blocker/blob/… এ এটি দুর্দান্ত ব্যবহার করা হয়েছে ।
স্টুয়ার্ট কার্ডাল

2
মনে রাখবেন যে ওএসএক্স সংস্করণটি sedডাব্লু / উদাহরণ হিসাবে দেখানো হয়নি, তবে gsedসংস্করণটি কাজ করে না।
SLM

2
ওএসএক্স সেড সম্পর্কে স্ল্যামের মন্তব্যের জন্য আরও প্রসঙ্গ: এটি \ x1b এর মতো নিয়ন্ত্রণের অক্ষরগুলিকে সমর্থন করে না। উদাহরণস্বরূপ, স্ট্যাকওভারফ্লো . com / a / 14881851 / 93345 । আপনি gsed কমান্ড মাধ্যমে পেতে পারেন brew install gnu-sed
স্টিমার 25

21

আমি আরও ভাল পালানোর সিকোয়েন্স রিমুভার খুঁজে পেয়েছি। এটা যাচাই কর:

perl -pe 's/\x1b\[[0-9;]*[mG]//g'


2
গৃহীত উত্তর থেকে কী উন্নতি হবে ( superuser.com/a/380778/46794 )?
ব্লেজারব্লেড

4
@ ব্লাইজারব্ল্যাড এটি ওএস এক্স-তে কাজ করে, যেখানে sed -rতা নেই।
বিভেঞ্জেরভ 16

10

যা প্রদর্শিত হয় ^[তা নয় ^ এবং [; এটি ASCII ESCঅক্ষর, দ্বারা উত্পাদিত Escবা Ctrl[( ^স্বরলিপিটির অর্থ Ctrl কী)।

ESC0x1B হেক্সাডেসিমাল বা 033 অক্টাল হয়, তাই আপনাকে ব্যবহার করতে হবে \x1Bবা \033আপনার রেজিজেসগুলিতে:

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

6

আপনি যদি কিছু সাধারণ পছন্দ করেন তবে আপনি স্ট্রিপ-অ্যানসি মডিউলটি ব্যবহার করতে পারেন ( নোড.জেএস প্রয়োজনীয়):

$ npm install --global strip-ansi-cli

তারপরে এটি ব্যবহার করুন:

$ strip-ansi < colors.o

বা কেবল একটি স্ট্রিং মধ্যে পাস:

$ strip-ansi '^[[37mABC^[[0m'

এটি cat( ইউইউওসি ) এর অকেজো ব্যবহার - এটি করা strip-ansi colors.oবা কমপক্ষে সম্ভব হওয়া উচিত strip-ansi < colors.o
স্কট

1
@ স্কট শিওর, আপনি এটি করতে পারেন strip-ansi < colors.o, তবে অভিজ্ঞতা থেকে লোকেরা পাইপিংয়ের সাথে আরও পরিচিত। আমি উত্তর আপডেট করেছি।
সিন্দ্রে সোরহুস

ভাল সরল সমাধান
21


2

"জবাব দেওয়া" প্রশ্নটি আমার পক্ষে কাজ করে না, তাই পার্ল টার্ম :: এএনএসিকোলার মডিউল দ্বারা উত্পাদিত এস্কেপ সিকোয়েন্সগুলি সরিয়ে দেওয়ার পরিবর্তে আমি এই রেজেক্সটি তৈরি করেছি।

cat colors.o | perl -pe 's/\x1b\[[^m]+m//g;

গ্রাভিটির রেজেক্স ঠিকঠাক কাজ করা উচিত, তবে + এর ব্যবহারটিও ঠিক কাজ করে।


4
(1) আপনি কী বলতে চাচ্ছেন The "answered" question? আপনি কি গ্রহণযোগ্য উত্তর বলতে চান? (২) এই কমান্ডটি কার্যকর করে না - এটি কার্যকর করে না - কারণ এটিতে একটি তুলনামূলক (ভারসাম্যহীন) উক্তি রয়েছে। (3) এটি cat( ইউইউওসি ) এর অকেজো ব্যবহার - এটি করা সম্ভব হওয়া উচিত । (৪) কোডগুলি ফাইলের মধ্যে থাকা সম্পর্কে কে কখনও বলেছে ? perl -pe command colors.o.o
স্কট

2

আমি বিশ্বাস করি এটি সমস্ত এএনএসআই অব্যাহতি সিকোয়েন্সগুলির একটি অনুমোদনযোগ্য অপসারণ :

perl -pe '
  s/\e\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]//g;
  s/\e[PX^_].*?\e\\//g;
  s/\e\][^\a]*(?:\a|\e\\)//g;
  s/\e[\[\]A-Z\\^_@]//g;'

(দয়া করে যে Perl মনে রাখবেন, অনেক অন্যান্য ভাষায় মত (কিন্তু sed নয়), গ্রহণ \eএস্কেপ অক্ষর যেমন Esc, \x1bবা \033কোড দ্বারা, টার্মিনাল দেখানো হিসাবে ^[। আমি তা এখানে ব্যবহার করছি কারণ এটি আরও বেশি ধারণাসম্পন্ন বলে মনে হয়।)

এই পার্ল কমান্ড, যা আপনি যদি চান তবে এক লাইনে সমস্ত চালাতে পারেন, এতে চারটি প্রতিস্থাপন রয়েছে:

প্রথমটি সিএসআই সিক্যুয়েন্সগুলির পরে চলে যায় (এস্কেপ কোড সিকোয়েন্সগুলি যা "কন্ট্রোল সিকোয়েন্স ইন্ট্রোডুসার" এর সাথে শুরু হয় Esc[, যা কালার কোড এবং অন্যান্য পাঠ্য সজ্জাতে সিলেক্ট গ্রাফিক রেন্ডিশন সিকোয়েন্সগুলির চেয়ে অনেক বেশি কভার করে )।

দ্বিতীয় প্রতিস্থাপনটি বাকী ক্রমগুলি সরিয়ে দেয় যা অনুসরণের অক্ষরগুলিকে জড়িত করে এবং এসটি (স্ট্রিং টার্মিনেটর, Esc\) দিয়ে শেষ হয়। তৃতীয় প্রতিস্থাপন একই জিনিস বরং পারবেন অপারেটিং সিস্টেম কমান্ড ক্রম একটি দিয়ে শেষ করতে BEL ( \x07, \007প্রায়ই \a)।

চতুর্থ প্রতিস্থাপন অবশিষ্ট পালিয়ে যায়।

অন্যান্য শূন্য-প্রস্থের ASCII অক্ষর যেমন BEL এবং অন্যান্য আরও অস্পষ্ট C0 এবং C1 নিয়ন্ত্রণ অক্ষর মুছে ফেলার কথা বিবেচনা করুন । আমি ব্যবহার করছি s/[\x00-\x1f\x7f-\x9f\xad]+//g, এর মধ্যে মুছুন এবং সফট হাইফেনও অন্তর্ভুক্ত । এটি ইউনিকোডের উচ্চতর কোডেড শূন্য-প্রস্থের অক্ষরগুলি বাদ দেয় কিন্তু আমি বিশ্বাস করি এটি ASCII (ইউনিকোড \x00- \xff) এর পক্ষে সম্পূর্ণ নয় । আপনি যদি এটি করেন তবে এগুলি শেষ করুন কারণ তারা দীর্ঘতর ক্রমগুলিতে জড়িত থাকতে পারে।


1

"tput sgr0" এই নিয়ন্ত্রণ অক্ষরটি ছেড়ে গেছে B (বি left [
এটি যত্ন নিতে এখানে একটি পরিবর্তিত সংস্করণ।

perl -pe 's/\e[\[\(][0-9;]*[mGKFB]//g' logfile.log

এর জন্য ধন্যবাদ ... এটি এ থেকে মুক্তি পাওয়ার জন্য আমার পক্ষে কাজ করেছে tput sgr0যা অন্য সমাধানগুলি কখনও এড়াতে সক্ষম বলে মনে হয় না।
TxAG98

0

পুট্টির মাধ্যমে ইন্টারেক্টিভ শীর্ষ আউটপুট সংগ্রহ করা থেকে যোগ করা অক্ষরগুলি মুছে ফেলার ক্ষেত্রে আমার একই সমস্যা ছিল এবং এটি সহায়তা করেছে:

cat putty1.log | perl -pe 's/\x1b.*?[mGKH]//g'

3
এটি cat( ইউইউওসি ) এর অকেজো ব্যবহার - এটি করা সম্ভব হওয়া উচিত । perl -pe command putty1.log
স্কট

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