โปรแกรมที่ส่ง STDIN ไปยัง STDOUT ด้วยรหัสสีถูกตัดออกหรือไม่


64

ฉันมีคำสั่งที่ให้ผลลัพธ์เป็นสีและฉันอยากจะแปะมันลงในไฟล์ที่มีรหัสสีหลุดออกมา มีคำสั่งที่ทำงานเหมือนcatยกเว้นว่าจะตัดรหัสสีหรือไม่? ฉันวางแผนที่จะทำสิ่งนี้:

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

4
อาจเป็นข้อผิดพลาดที่โปรแกรมสร้างเอาต์พุตสีแม้ว่าผลลัพธ์ของมันจะถูกเปลี่ยนเส้นทางไปยังไฟล์และไม่มีตัวเลือกในการปิด ฉันคาดหวังว่าโปรแกรมใด ๆ ที่ให้สีเป็นผลลัพธ์ในการตรวจสอบisatty(stdin)ก่อนทำเช่นนั้น ใจที่จะแบ่งปันโปรแกรมนั้นคืออะไร?
alex

ผ่านมันไปcat- การทดสอบที่รวดเร็วgrep --color=auto myusername /etc/passwdฉันใช้ชื่อผู้ใช้ของฉันเป็นสีแดงพร้อมข้อความสีขาวที่อื่น ๆ grep --color=auto myusername /etc/passwd | catให้ข้อความสีขาวธรรมดาแก่ฉัน
ivanivan

1
นั่นไม่ใช่วิธีแก้ปัญหา ใช้งานได้เพียงเพราะgrep --color=autoหลีกเลี่ยงการสร้างเอาต์พุตสีเมื่อเอาต์พุตมาตรฐานไม่ใช่เทอร์มินัล ฉันกำลังพูดถึงคำสั่งที่เอาท์พุทรหัสสีโดยไม่มีเงื่อนไข (เป็นจุดเล็กซ์ออกมาข้างต้นพฤติกรรมดังกล่าวเป็น arguably ข้อผิดพลาด แต่บางครั้งเราต้องทำงานร่วมกับซอฟแวร์ที่ไม่สมบูรณ์ที่เราไม่สามารถแก้ไขตัวเองและนั่นคือสิ่งที่คำถามนี้เป็นเรื่องเกี่ยวกับ.)
ไรอัน ธ อมป์สัน

อาจมีความเกี่ยวข้องunix.stackexchange.com/questions/14684/ …
Chris Stryczynski

คำตอบ:


59

คุณคิดว่าจะมีประโยชน์สำหรับสิ่งนั้น แต่ฉันหามันไม่เจอ อย่างไรก็ตาม Perl หนึ่งซับควรทำเคล็ดลับ:

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;
}

หากคุณต้องการตัดเฉพาะรหัสสีและปล่อยให้รหัส ANSI อื่น ๆ (เช่นการเลื่อนเคอร์เซอร์) เพียงอย่างเดียวให้ใช้

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

แทนการทดแทนฉันใช้ด้านบน (ซึ่งลบรหัสการหลบหนี ANSI ทั้งหมด)


9
ดังกล่าวในความคิดเห็นที่คำตอบอื่น ( unix.stackexchange.com/questions/4527/... ) regex Term::ANSIColorนี้ที่ดึงมาจาก รับทราบแหล่งที่มาของคุณโปรด!
forivall

2
รับทราบแหล่งที่มาของคุณ!
Jürgen Paul

29

ลบรหัสสี (อักขระพิเศษ) ด้วย GNU sed

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

หรือ

Strip ANSI escape sequences ใน Python

ติดตั้งแพ็คเกจ colorama python ( 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

Python ค่อนข้างช้า แต่sedน่าประทับใจ :)

2
ไม่ลองใช้ python แต่รุ่น sed ไม่ได้ตัดสีทั้งหมด (ฉันไม่ได้ทดสอบอย่างละเอียด แต่ก็เหลือสีพื้นหลังบางส่วนเหมือนเดิมดังนั้นฉันจึงเลือก
ออปชั่

22

หากคุณสามารถติดตั้งโมดูลTerm :: ANSIColorสคริปต์ Perl นี้จะทำงาน:

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

5
ที่จริงแล้วที่ฉันได้รับ regex รหัสสีเท่านั้น แต่การติดตั้งโมดูลทั้งหมดสำหรับ regex ตัวเดียวนั้นค่อนข้างมาก
cjm

4
ถ้าคุณตั้งค่า cpanm ถูกต้องมันจะทำการติดตั้งโมดูลในเวลาประมาณ 5 วินาที
Ryan Thompson

ไม่จำเป็นต้องเขียนสคริปต์ไปยังไฟล์ เพียงแค่เข้าไปใน:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick

10

หากระบบของคุณมีการเข้าถึงNodeJSคุณสามารถติดตั้งแพคเกจโหนดต่อไปนี้, strip-ansi-cli.

$ npm install -g strip-ansi-cli

จากนั้นคุณสามารถเรียกใช้คำสั่งของคุณเช่น:

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

1
NodeJS เป็นการพึ่งพาอาศัยขนาดใหญ่เมื่อมีวิธีแก้ปัญหาที่สามารถใช้ภาษาและเครื่องมือที่มีอยู่แล้วในระบบส่วนใหญ่
user137369

นอกจากนี้เป็นวิธีการแก้ปัญหาที่ช้าที่สุดที่ระบุไว้ (ดูที่นี่ ) และคุณอาจจะเห็นความแตกต่าง

3

คำสั่ง sed นี้ทำเพื่อฉัน:

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

ตัวอย่าง:

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

sedนี้ดูเหมือนจะไม่ทำงานกับรุ่นล่าสุดของ

3

คุณสามารถใช้acสำหรับสิ่งนี้ ควรเร็วกว่าสิ่งใด ๆ ที่ระบุไว้ข้างต้น (แม้ว่าperlและsedควรเหมาะสม) นี่คือตัวอย่าง:

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

ตามข้อจำกัดความรับผิดชอบ: ฟังก์ชั่นการกรองสีเขียนขึ้นโดยฉัน


3
ลิงก์ไปยัง 'ac' ทุ่งจะเป็นประโยชน์ ;)
Vitaly Kushner

acโปรแกรมน่าจะเป็นที่นี่: hub.darcs.net/vmchale/fastcat
ไมเคิลเสี้ยน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.