Nếu bạn thêm một lệnh | sed -n l
đó tail
, để hiển thị các ký tự không in được, có thể bạn sẽ thấy một cái gì đó như:
N\bNA\bAM\bME\bE
Đó là, mỗi ký tự được viết là X
Backspace X
. Trên các thiết bị đầu cuối hiện đại, ký tự cuối cùng được viết lên chính nó (vì Backspace aka BS aka \b
aka ^H
là ký tự di chuyển con trỏ một cột sang trái) không có sự khác biệt. Nhưng trong các máy đánh chữ cổ, điều đó sẽ khiến nhân vật xuất hiện in đậm vì nó tốn gấp đôi mực.
Tuy nhiên, các máy nhắn tin thích more
/ less
không hiểu định dạng đó có nghĩa là in đậm, vì vậy đó vẫn là những gì roff
để xuất văn bản in đậm.
Một số triển khai của con người sẽ gọi roff
theo cách mà các chuỗi đó không được sử dụng (hoặc gọi nội bộ col -b -p -x
để loại bỏ chúng như trong trường hợp man-db
thực hiện (trừ khi MAN_KEEP_FORMATTING
biến môi trường được đặt)) và không gọi máy nhắn tin khi chúng phát hiện đầu ra sẽ không đến một thiết bị đầu cuối (vì vậy man bash | grep NAME
sẽ làm việc ở đó), nhưng không phải là của bạn.
Bạn có thể sử dụng col -b
để loại bỏ các chuỗi đó (có các loại khác ( _
BS X
) cũng như gạch chân).
Đối với các hệ thống sử dụng GNU roff
(như GNU hoặc FreeBSD), bạn có thể tránh các chuỗi đó được sử dụng ở nơi đầu tiên bằng cách đảm bảo các -c -b -u
tùy chọn được chuyển đến grotty
, ví dụ bằng cách đảm bảo các -P-cbu
tùy chọn được chuyển đến groff
.
Chẳng hạn, bằng cách tạo một tập lệnh bao bọc groff
có tên :
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Mà bạn đặt trước / usr / bin / groff in $PATH
.
Với macOS ' man
(cũng sử dụng GNU roff
), bạn có thể tạo một man-no-overstrike.conf
:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
Và gọi man
là:
man -C man-no-overstrike.conf bash | grep NAME
Vẫn với GNU roff
, nếu bạn đặt GROFF_SGR
biến môi trường (hoặc không đặt GROFF_NO_SGR
biến tùy thuộc vào cách đặt mặc định tại thời điểm biên dịch), thì grotty
(miễn là nó không được thông qua -c
tùy chọn) sẽ sử dụng các chuỗi thoát thiết bị đầu cuối ANSI SGR thay thế của những thủ thuật BS cho các thuộc tính nhân vật. less
hiểu chúng khi được gọi với -R
tùy chọn.
Người đàn ông của FreeBSD gọi grotty
với -c
tùy chọn trừ khi bạn yêu cầu màu bằng cách đặt biến MANCOLOR (trong trường hợp -c
này không được chuyển đến grotty
và grotty
trở về mặc định sử dụng chuỗi thoát ANR SGR ở đó).
MANCOLOR=1 man bash | grep NAME
sẽ làm việc ở đó
Trên Debian, GROFF_SGR không phải là mặc định. Nếu bạn làm:
GROFF_SGR=1 man bash | grep NAME
tuy nhiên, vì man
thiết bị xuất chuẩn không phải là thiết bị đầu cuối, nên nó cũng tự chuyển nó sang một GROFF_NO_SGR
biến grotty
(tôi cho rằng nó có thể sử dụng col -bpx
để loại bỏ các chuỗi BS vì col
không biết cách loại bỏ các chuỗi SGR, mặc dù nó vẫn còn nó với MAN_KEEP_FORMATTING
) mà ghi đè của chúng tôi GROFF_SGR
. Bạn có thể làm thay thế:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(trong một thiết bị đầu cuối) để có các chuỗi thoát SGR.
Lúc đó, bạn sẽ nhận thấy rằng một số TÊN đó xuất hiện in đậm trên thiết bị đầu cuối (và trong less -R
máy nhắn tin). Nếu bạn cung cấp đầu ra cho sed -n l
( MANPAGER='sed -n /NAME/l'
), bạn sẽ thấy một cái gì đó như:
\033[1mNAME\033[0m$
Trường hợp \e[1m
trình tự bật đậm trong các thiết bị đầu cuối tương thích ANSI và \e[0m
trình tự hoàn nguyên tất cả các thuộc tính SGR về mặc định.
Trên văn bản đó grep NAME
hoạt động như văn bản đó có chứa NAME
, nhưng bạn vẫn có thể gặp vấn đề nếu tìm kiếm văn bản chỉ có các phần của nó được in đậm / gạch chân ...