ถ้าคุณเพิ่ม| sed -n lว่าtailคำสั่งที่จะแสดงตัวอักษรที่ไม่สามารถพิมพ์คุณอาจจะเห็นสิ่งที่ชอบ:
N\bNA\bAM\bME\bE
นั่นคือตัวละครแต่ละตัวเขียนเป็นBackspaceX Xบนเทอร์มินัลสมัยใหม่ตัวละครจบลงด้วยการเขียนทับตัวเอง (เช่น Backspace หรือ BS aka \baka ^Hคือตัวละครที่ย้ายเคอร์เซอร์หนึ่งคอลัมน์ไปทางซ้าย) โดยไม่มีความแตกต่าง แต่ในเครื่องพิมพ์ดีดโบราณซึ่งจะทำให้ตัวละครปรากฏเป็นตัวหนาเมื่อได้รับหมึกมากเป็นสองเท่า
แต่ถึงกระนั้นวิทยุติดตามตัวเช่นmore/ lessเข้าใจรูปแบบนั้นหมายถึงตัวหนาดังนั้นนั่นคือสิ่งที่roffจะส่งออกข้อความตัวหนา
การใช้งานของผู้ชายบางคนจะเรียกroffในลักษณะที่ไม่ใช้ลำดับเหล่านั้น (หรือเรียกภายในcol -b -p -xเพื่อดึงพวกเขาเช่นในกรณีของการman-dbใช้งาน (เว้นแต่MAN_KEEP_FORMATTINGตัวแปรสภาพแวดล้อมที่มีการตั้งค่า)) และไม่เรียกเพจเจอร์เมื่อพวกเขาตรวจพบผลลัพธ์ จะไม่ไปที่เทอร์มินัล ( man bash | grep NAMEจะทำงานที่นั่น) แต่ไม่ใช่ของคุณ
คุณสามารถใช้col -bเพื่อลบลำดับเหล่านั้น (มีประเภทอื่น ๆ ( _BS X) เช่นเดียวกับขีดเส้นใต้)
สำหรับระบบที่ใช้ GNU roff(เช่น GNU หรือ FreeBSD) คุณสามารถหลีกเลี่ยงลำดับผู้ที่ถูกนำมาใช้ในครั้งแรกโดยการทำให้แน่ใจว่า-c -b -uตัวเลือกที่จะส่งผ่านไปgrottyตัวอย่างเช่นโดยการทำให้แน่ใจว่าตัวเลือกที่ถูกส่งไปยัง-P-cbugroff
ตัวอย่างเช่นโดยการสร้างสคริปต์ wrapper ที่เรียกว่าgroffมี:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
ที่คุณใส่ไปข้างหน้าของ / usr / bin / Groff $PATHใน
ด้วย macOS ' man(เช่นใช้ GNU roff) คุณสามารถสร้าง a man-no-overstrike.confด้วย:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
และโทรmanเป็น:
man -C man-no-overstrike.conf bash | grep NAME
ยังคงอยู่กับ GNU roffถ้าคุณตั้งค่าGROFF_SGRตัวแปรสภาพแวดล้อม (หรือไม่ตั้งค่าGROFF_NO_SGRตัวแปรขึ้นอยู่กับวิธีการตั้งค่าเริ่มต้นในเวลารวบรวม) จากนั้นgrotty(ตราบใดที่ยังไม่ผ่าน-cตัวเลือก) จะใช้ลำดับการหลบหนีเทอร์มินัล ANSI SGR แทน ของเทคนิค BS เหล่านั้นสำหรับคุณลักษณะของตัวละคร lessเข้าใจพวกเขาเมื่อถูกเรียกพร้อมกับ-Rตัวเลือก
คน FreeBSD โทรหาgrottyด้วย-cตัวเลือกเว้นแต่คุณจะถามหาสีโดยการตั้งค่าตัวแปร MANCOLOR (ในกรณีที่-cไม่ผ่านgrottyและgrottyกลับไปใช้ค่าเริ่มต้นของการใช้ลำดับการหลีกหนีของ ANSI SGR ที่นั่น)
MANCOLOR=1 man bash | grep NAME
จะทำงานที่นั่น
บน Debian นั้น GROFF_SGR ไม่ใช่ค่าเริ่มต้น ถ้าคุณทำ:
GROFF_SGR=1 man bash | grep NAME
อย่างไรก็ตามเนื่องจากmanstdout ไม่ใช่เทอร์มินัลจึงต้องผ่านตัวเองเพื่อส่งGROFF_NO_SGRตัวแปรไปยังgrotty(ฉันคิดว่ามันสามารถใช้col -bpxเพื่อตัดลำดับ BS ได้เนื่องจากcolไม่ทราบว่าจะตัดลำดับ SGR ได้อย่างไรแม้ว่ามันจะยังคง ไม่ได้ด้วยMAN_KEEP_FORMATTING) GROFF_SGRซึ่งแทนที่เรา คุณสามารถทำได้:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(ในเทอร์มินัล) เพื่อให้ลำดับหนี SGR
เวลานั้นคุณจะสังเกตเห็นว่าNAMEบางรายการปรากฏเป็นตัวหนาในหน้าจอเทอร์มินัล (และในless -Rเพจเจอร์) หากคุณป้อนผลลัพธ์ไปที่sed -n l( MANPAGER='sed -n /NAME/l') คุณจะเห็นสิ่งต่อไปนี้:
\033[1mNAME\033[0m$
ที่ไหน\e[1mเป็นลำดับเพื่อเปิดใช้งานตัวหนาในอาคารที่รองรับมาตรฐาน ANSI และ\e[0mลำดับเพื่อกลับแอตทริบิวต์ SGR ทุกคนที่จะเริ่มต้น
ในข้อความนั้นgrep NAMEทำงานเหมือนข้อความนั้นNAMEแต่คุณยังคงมีปัญหาหากค้นหาข้อความที่มีเพียงบางส่วนของตัวหนา / ขีดเส้นใต้ ...