grep --color เพิ่มรหัส ANSI ESC [K - สิ่งนี้สามารถเปลี่ยนข้อความที่แสดง


9

ทำไม grep จึงเพิ่มรหัส ANSI \e[Kลงในเอาท์พุตสี ฉันไม่เห็นจุดของมัน แต่เห็นได้ชัดว่านักพัฒนาสามารถ มันเป็นรหัสมาตรฐาน ANSI / VT100 ร์มินัลที่ใช้ในการ"ล้างเส้นจากตำแหน่งเคอร์เซอร์ปัจจุบันที่จะสิ้นสุดของเส้น"

ในกรณีที่มีขอบ grep สามารถทำให้ข้อความ "หายไป" จากจอแสดงผลขั้ว ตัวอย่างเช่น:

echo -e "ab\rc"
echo -e "ab\rc" |grep --color=always "c"

echoง่ายแสดง: cbแต่หน้าจอcolorizedแสดง:c

ข้อความที่เข้ารหัสที่สำคัญคือ: echo -e 'ab\r\033[01;31m\033[Kc\033[m\033[K' อย่างไรก็ตามหากไม่มี\e[Kรหัสจะ echo -e 'ab\r\033[01;31mc\033[m'ทำงานได้ตามที่คาดไว้!

อะไรคือสาเหตุของการรวม\e[Kรหัสเหล่านี้ของ grep ฉันเขียนสคริปต์เพื่ออนุญาตให้มีการซ้อนทับของสองผ่านการระบายสีc=--color=always; ls $c /bin/gzip | grep $c 'z'เช่น: ดังนั้นผมจึงจำเป็นต้องเข้าใจ\e[Kความหมายว่าทำไม grep

คำตอบ:


11

คุณสามารถเปลี่ยนพฤติกรรมนี้โดยการตั้งค่าGREP_COLORSตัวแปรสภาพแวดล้อม:

export GREP_COLORS=ne
echo -e "ab\rc" | grep --color=always "c"

จากgrepหน้าคน:

          ne     Boolean  value  that prevents clearing to the end of line
                 using Erase in Line (EL) to Right  (\33[K)  each  time  a
                 colorized  item  ends.   This  is  needed on terminals on
                 which EL is not supported.  It  is  otherwise  useful  on
                 terminals  for  which  the back_color_erase (bce) boolean
                 terminfo capability  does  not  apply,  when  the  chosen
                 highlight colors do not affect the background, or when EL
                 is too slow or causes too much flicker.  The  default  is
                 false (i.e., the capability is omitted).

มันทำในสถานที่แรกเพื่อตั้งค่าพื้นหลังของบรรทัดที่เหลือเป็นสีที่ถูกต้องในกรณีที่มีการเปลี่ยนแปลงก่อนหน้านี้ (โดยค่าเริ่มต้นมันไม่ใช่; บางคนอาจตั้งค่าให้ทำในการตั้งค่าของตัวเอง)

คุณอาจต้องการเล่นกับตัวเลือกอื่น ๆ ที่สามารถตั้งค่าได้GREP_COLORS; ดู man page สำหรับรายละเอียดแบบเต็ม

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