Jeśli dodasz | sed -n l
do tego tail
polecenia, aby wyświetlać znaki niedrukowalne, prawdopodobnie zobaczysz coś takiego:
N\bNA\bAM\bME\bE
Oznacza to, że każdy znak jest pisany jako X
Backspace X
. Na nowoczesnych terminalach znak kończy się nad sobą (ponieważ Backspace aka BS aka \b
aka ^H
to znak, który przesuwa kursor o jedną kolumnę w lewo) bez różnicy. Ale w starożytnych maszynach do pisania to sprawiałoby, że postać pojawiała się pogrubioną czcionką, ponieważ otrzymywała dwa razy więcej atramentu.
Mimo to, pagery takie jak more
/ less
do rozumieją ten format jako pogrubiony, więc nadal to roff
robi, aby uzyskać pogrubiony tekst.
Niektóre implementacje man wywoływałyby roff
w taki sposób, że te sekwencje nie byłyby używane (lub byłyby wywoływane wewnętrznie, col -b -p -x
aby je rozebrać, tak jak w przypadku man-db
implementacji (chyba że MAN_KEEP_FORMATTING
ustawiono zmienną środowiskową)) i nie wywoływały pagera po wykryciu wyniku nie jedzie do terminalu (więc man bash | grep NAME
by tam działał), ale nie twój.
Możesz użyć col -b
do usunięcia tych sekwencji (istnieją również inne typy ( _
BS X
) również dla podkreślenia).
W przypadku systemów korzystających z GNU roff
(takich jak GNU lub FreeBSD) możesz uniknąć używania tych sekwencji, upewniając się, że -c -b -u
opcje zostały przekazane grotty
, na przykład upewniając się, że -P-cbu
opcje zostały przekazane groff
.
Na przykład poprzez utworzenie skryptu opakowania o nazwie groff
zawierającego:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Które umieściłeś przed / usr / bin / groff $PATH
.
W systemie macOS ' man
(również używającym GNU roff
) możesz utworzyć man-no-overstrike.conf
:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
I zadzwoń man
jako:
man -C man-no-overstrike.conf bash | grep NAME
Nadal w GNU roff
, jeśli ustawisz GROFF_SGR
zmienną środowiskową (lub nie ustawisz GROFF_NO_SGR
zmiennej w zależności od tego, jak domyślne zostały ustawione w czasie kompilacji), wtedy grotty
(o ile nie zostanie przekazana -c
opcja) użyje zamiast tego sekwencji ucieczki terminala ANSI SGR tych sztuczek BS dla atrybutów postaci. less
zrozumieć je, gdy zostanie wywołany z -R
opcją.
Man wywołuje FreeBSD grotty
z tą -c
opcją, chyba że pytasz o kolory , ustawiając zmienną MANCOLOR (w którym -c
to przypadku nie jest przekazywany grotty
i grotty
powraca do domyślnego użycia sekwencji specjalnych ANSI SGR).
MANCOLOR=1 man bash | grep NAME
będzie tam działać.
W Debianie GROFF_SGR nie jest domyślny. Jeśli zrobisz:
GROFF_SGR=1 man bash | grep NAME
jednak ponieważ standardowe man
wyjście nie jest terminalem, na siebie spoczywa również obowiązek przekazania GROFF_NO_SGR
zmiennej do grotty
(przypuszczam, że może on użyć col -bpx
do rozebrania sekwencji BS, ponieważ col
nie wie, jak rozebrać sekwencje SGR, mimo że nadal robi to z MAN_KEEP_FORMATTING
), co zastępuje nasze GROFF_SGR
. Możesz zamiast tego:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(w terminalu), aby mieć sekwencje specjalne SGR.
Tym razem zauważysz, że niektóre z tych NAZW są pogrubione na terminalu (i na less -R
pagerze). Jeśli podasz wynik do sed -n l
( MANPAGER='sed -n /NAME/l'
), zobaczysz coś takiego:
\033[1mNAME\033[0m$
Gdzie \e[1m
jest sekwencja, aby włączyć pogrubienie w terminalach kompatybilnych z ANSI, a \e[0m
sekwencja, aby przywrócić wszystkie atrybuty SGR do wartości domyślnej.
Ten tekst grep NAME
działa tak, jak on zawiera tekst NAME
, ale nadal możesz mieć problemy, jeśli szukasz tekstu, w którym tylko jego części są pogrubione / podkreślone ...