প্রোগ্রাম যা STDIN কে STDOUT এ রঙ কোডগুলি ছিনিয়ে দেয়?


64

আমার কাছে একটি কমান্ড রয়েছে যা রঙের আউটপুট উত্পাদন করে এবং আমি রঙিন কোডগুলি ছিটিয়ে দেওয়া একটি ফাইলের মধ্যে এটি পাইপ করতে চাই। এমন কোনও কমান্ড আছে যা catরঙ কোডগুলি বাদ দেয় তা ছাড়া কাজ করে ? আমি এরকম কিছু করার পরিকল্পনা করছি:

$ command-that-produces-colored-output | stripcolorcodes > outfile

4
এটি কোনও ত্রুটি হতে পারে যা কোনও প্রোগ্রাম রঙিন আউটপুট তৈরি করে তারপরেও তার আউটপুট কোনও ফাইলে পুনঃনির্দেশিত হয় এবং এটিকে স্যুইচ অফ করার কোনও বিকল্প সরবরাহ করে না। আমি এমন কোনও প্রোগ্রাম আশা করবো যা এর isatty(stdin)পূর্বে আউটপুটটি রঙ করে এমনটি করার আগে এটি পরীক্ষা করবে । মনের কথা শেয়ার করে দেখি কী প্রোগ্রাম?
অ্যালেক্স

এটি দিয়ে দিন cat- দ্রুত পরীক্ষার জন্য আমি দৌড়েছি grep --color=auto myusername /etc/passwdআমার সাদা নাম সহ সাদা রঙের ব্যবহারকারীর নাম দেয় wh grep --color=auto myusername /etc/passwd | catআমাকে সরল সাদা পাঠ্য দেয়
ivanivan

1
এটি কোনও সমাধান নয়। এটি শুধুমাত্র কাজ করে কারণ grep --color=autoস্ট্যান্ডার্ড আউটপুট টার্মিনাল না হলে রঙিন আউটপুট উত্পাদন করা এড়ানো হয়। আমি এমন একটি কমান্ডের কথা বলছি যা শর্তযুক্ত রঙ কোডগুলি আউটপুট করে। (অ্যালেক্সটি উপরে উল্লেখ করেছে যে, এই জাতীয় আচরণটি ত্রুটিপূর্ণভাবে ত্রুটিযুক্ত, তবে কখনও কখনও আমাদের অপূর্ণ সফ্টওয়্যার নিয়ে কাজ করা দরকার যা আমরা সহজেই নিজেকে ঠিক করতে পারি না, এবং এই প্রশ্নটিই তাই))
রায়ান থম্পসন

উত্তর:


59

আপনি মনে করেন যে এর জন্য কোনও উপযোগিতা থাকবে তবে আমি এটি খুঁজে পেলাম না। তবে এই পার্ল ওয়ান-লাইনারের কৌশলটি করা উচিত:

perl -pe 's/\e\[?.*?[\@-~]//g'

উদাহরণ:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

অথবা, আপনি যদি কোনও স্ক্রিপ্ট চান তবে আপনি এটি সংরক্ষণ করতে পারেন stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

আপনি যদি কেবল রঙের কোডগুলি স্ট্রিপ করতে চান এবং অন্য কোনও এএনএসআই কোড (কার্সার আন্দোলনের মতো) একা ছেড়ে যান তবে ব্যবহার করুন

s/\e\[[\d;]*m//g;

উপরে উল্লিখিত প্রতিস্থাপনের পরিবর্তে (যা সমস্ত এএনএসআই এস্কেপ কোড সরিয়ে দেয়)।


9
অন্য উত্তরের মন্তব্যে যেমন উল্লেখ করা হয়েছে ( unix.stackexchange.com/questions/4527/… ), এই রেজেক্সটি এখান থেকে টানা হয়েছিল Term::ANSIColor। আপনার উত্স স্বীকার করুন, দয়া করে!
forivall

2
আপনার উত্স স্বীকার!
জর্জেন পল

29

GNU সেড সহ রঙের কোডগুলি (বিশেষ অক্ষরগুলি) সরান

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

অথবা

পাইথনে এএনএসআই এস্কেপ সিকোয়্যারস করুন

কলোরামা পাইথন প্যাকেজ ইনস্টল করুন ( pip install colorama)। এতে রাখুন stripcolorcodes:

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

চালান chmod +x stripcolorcodes


এটা সত্যিই দারুন. ঠিক আমার কী দরকার!
adivis12

পাইথনটি কিছুটা ধীরে হলেও sedচিত্তাকর্ষক :)

2
অজগর চেষ্টা করে দেখেনি, তবে সেড সংস্করণটি সমস্ত রঙ ফেলা করে না। (আমি নিখুঁতভাবে পরীক্ষা করিনি, তবে এটি কিছু পটভূমির রঙ অক্ষত রেখে দিয়েছে, তাই আমি দ্রুত পার্ল বিকল্পটি দিয়ে
চলেছি

22

আপনি যদি শব্দটি :: এএনএসিকলোর মডিউলটি ইনস্টল করতে পারেন তবে এই পার্ল স্ক্রিপ্টটি কাজ করে:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;

5
এটিই আমি যেখানে রঙ-কোড-কেবলমাত্র রেইগেক্স পেয়েছি। তবে কেবলমাত্র একটি রেজেক্সের জন্য একটি সম্পূর্ণ মডিউল ইনস্টল করা কিছুটা বেশি।
সিজেএম

4
মেহ, আপনি সিপিএনএম সঠিকভাবে সেট আপ করলে এটি প্রায় 5 সেকেন্ডের মধ্যে মডিউলটি ইনস্টল করে।
রায়ান থম্পসন

ফাইলটিতে স্ক্রিপ্ট লেখার দরকার নেই। কেবল পাইপ এতে:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
জেসি গ্লিক

10

আপনার সিস্টেমে নোডজেএসে অ্যাক্সেস থাকলে আপনি নিম্নলিখিত নোড প্যাকেজটি ইনস্টল করতে পারেন strip-ansi-cli,।

$ npm install -g strip-ansi-cli

তারপরে আপনি আপনার আদেশটি এভাবে চালাতে পারেন:

$ command-that-produces-colored-output | strip-ansi > outfile

1
নোডজেএস একটি বিশাল নির্ভরতা, যখন বেশিরভাগ সিস্টেমে ইতিমধ্যে উপস্থিত ভাষা ও সরঞ্জামগুলি ব্যবহার করতে পারে এমন সমাধান রয়েছে।
ব্যবহারকারী 137369

এছাড়াও, এই ধীরতম সমাধান তালিকাভুক্ত করা হয় (দেখুন এখানে ) এবং আপনি সম্ভবত হবে পার্থক্য লক্ষ্য।

3

এই সেড কমান্ডটি আমার পক্ষে এটি করেছে:

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

উদাহরণ:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile

এটি সর্বশেষতম সংস্করণে কাজ করে বলে মনে হচ্ছে না sed

3

আপনি এটির জন্য এসি ব্যবহার করতে পারেন । এটা তোলে উপরে তালিকাভুক্ত কিছু তুলনায় দ্রুততর হওয়া উচিত (যদিও perlএবং sedশালীন হওয়া উচিত)। এখানে একটি উদাহরণ:

curl -s wttr.in/LA | ac -s

দাবি অস্বীকার হিসাবে: রঙিন ফিল্টারিং কার্যকারিতা আমার দ্বারা রচিত হয়েছিল।


3
'এসি'-র একটি লিঙ্ক সহায়ক হবে। ;)
ভিটালি কুশনার

acপ্রোগ্রাম এখানে মনে করা হয়: hub.darcs.net/vmchale/fastcat
মাইকেল চোরকাঁটা

1
$ command-that-produces-colored-output | ansifilter

... এবং যদি প্রয়োজন হয়, (dnf, ...) install ansifilter

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