วิธีตัดรหัสสีออกจาก stdout และ pipe ไปยัง file และ stdout


14

ฉันมีโปรแกรมที่ใช้printfกับบางtputผสมอยู่ในนั้นและฉันต้องการที่จะท่อส่งออกไป stdout เช่นเดียวกับไฟล์ ฉันต้องการที่จะใช้sedเนื่องจากฉันไม่ต้องการการพึ่งพาที่ไม่จำเป็นในสคริปต์ของฉัน นี่คือสิ่งที่ฉันได้รับจนถึง

printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" | tee install.log

ปัญหาเดียวของเรื่องนี้คือไฟล์บันทึกของฉันกำลังรับเอาท์พุทสีทั้งหมดเช่นนี้ ...

^[[36m| ^[(B^[[m^[[37mSourcing files...^[[m

ฉันอยากให้มันมี | Sourcing files...



@StephaneChazelas ฉันพยายามที่จะไม่ใช้สคริปต์ perl ใด ๆ ในตอนนี้และแม้กระทั่งsedตัวเลือกที่ดูเหมือนจะไม่ทำงาน
iamnewton

คำตอบ:


12

ตามคำสั่งของการลบสีออกคุณควรจะ:

printf "\n$(tput setaf 6)| $(tput sgr0)$(tput setaf 7)Sourcing files...\033[m\n" |\
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" |tee install.log
w/o "-r"
sed "s/\x1B\[\([0-9]\{1,2\}\(;[0-9]\{1,2\}\)\?\)\?[mGK]//g"

เพื่อความสะดวกคุณสามารถสร้างนามแฝงได้ /etc/profile

alias stripcolors='sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g"'
w/o '-r'
alias stripcolors='sed "s/\x1B\[\([0-9]\{1,2\}\(;[0-9]\{1,2\}\)\?\)\?[mGK]//g"'

[แก้ไข]

ด้วยเอาต์พุตที่กำหนดคุณสามารถตรวจสอบได้ด้วยตัวเอง:

#!/usr/bin/perl

while ($line=<DATA>) {
    $line =~ s/^[0-9a-f]+: //;
    while ($line =~ s/([0-9a-f]{2})(?=[0-9a-f]{2}| )//) {
      print chr(hex($1));
    }
}
__DATA__
0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761 .[1m.[33m... Wa
0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20 rning: .(B.[mNo
0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368 /Users/apw/.bash
0000030: 2066 6f75 6e64 2e21 0a found.!.

ผลลัพธ์:

$ perl checkerbunny|xxd
0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761  .[1m.[33m...  Wa
0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20  rning: .(B.[mNo 
0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368  /Users/apw/.bash
0000030: 2066 6f75 6e64 2e21 0a                    found.!.

$ perl checkerbunny|stripcolors|xxd
0000000: e29a a020 2057 6172 6e69 6e67 3a20 1b28  ...  Warning: .(
0000010: 424e 6f20 2f55 7365 7273 2f61 7077 2f2e  BNo /Users/apw/.
0000020: 6261 7368 2066 6f75 6e64 2e21 0a         bash found.!.

1
-rดูเหมือนว่าการตั้งค่าสถานะจะไม่ทำงานบน Mac BSD ดังนั้นฉันพยายามใช้-Eดูเหมือนจะคล้ายกันมากที่สุดและมันยังคงแสดงผลในล็อกไฟล์เช่นนี้ ... ^[36m| ^[(B^[[m^[[37mSourcing files...^[[m มันกลับมาเหมือน| ^[(BSourcing files...ในกล่อง Linux ของฉัน
iamnewton

โปรดแสดงให้เราเห็นผลลัพธ์ของการพิมพ์ cmd ของคุณด้วย|xxdและTERMenv ของคุณ var

TERMxterm=> 0000000: 1b5b 316d 1b5b 3333 6de2 9aa0 2020 5761 .[1m.[33m... Wa 0000010: 726e 696e 673a 201b 2842 1b5b 6d4e 6f20 rning: .(B.[mNo 0000020: 2f55 7365 7273 2f61 7077 2f2e 6261 7368 /Users/apw/.bash 0000030: 2066 6f75 6e64 2e21 0a found.!.
iamnewton

1
มันยังทำให้ฉันได้ผลลัพธ์เดียวกันยกเว้นว่าฉันต้องเปลี่ยนstripcolorsฟังก์ชั่นเพราะ Mac OS X ไม่เข้าใจ-rตัวเลือกสำหรับsedคำสั่ง ฉันสมมติว่าคุณใช้ Linux distro อยู่ใช่ไหม?
iamnewton

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