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à XBackspace 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 \baka ^Hlà 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/ lesskhô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 rofftheo 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-dbthực hiện (trừ khi MAN_KEEP_FORMATTINGbiế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 NAMEsẽ 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 -utùy chọn được chuyển đến grotty, ví dụ bằng cách đảm bảo các -P-cbutù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 groffcó 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 manlà:
man -C man-no-overstrike.conf bash | grep NAME
Vẫn với GNU roff, nếu bạn đặt GROFF_SGRbiến môi trường (hoặc không đặt GROFF_NO_SGRbiế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 -ctù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. lesshiểu chúng khi được gọi với -Rtùy chọn.
Người đàn ông của FreeBSD gọi grottyvới -ctù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 -cnày không được chuyển đến grottyvà grottytrở 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ì manthiế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_SGRbiến grotty(tôi cho rằng nó có thể sử dụng col -bpxđể loại bỏ các chuỗi BS vì colkhô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 -Rmá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[1mtrình tự bật đậm trong các thiết bị đầu cuối tương thích ANSI và \e[0mtrì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 NAMEhoạ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 ...