ถ้าคุณเพิ่ม| sed -n l
ว่าtail
คำสั่งที่จะแสดงตัวอักษรที่ไม่สามารถพิมพ์คุณอาจจะเห็นสิ่งที่ชอบ:
N\bNA\bAM\bME\bE
นั่นคือตัวละครแต่ละตัวเขียนเป็นBackspaceX
X
บนเทอร์มินัลสมัยใหม่ตัวละครจบลงด้วยการเขียนทับตัวเอง (เช่น Backspace หรือ BS aka \b
aka ^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-cbu
groff
ตัวอย่างเช่นโดยการสร้างสคริปต์ 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
อย่างไรก็ตามเนื่องจากman
stdout ไม่ใช่เทอร์มินัลจึงต้องผ่านตัวเองเพื่อส่ง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
แต่คุณยังคงมีปัญหาหากค้นหาข้อความที่มีเพียงบางส่วนของตัวหนา / ขีดเส้นใต้ ...