Se aggiungi | sed -n l
a quel tail
comando, per mostrare caratteri non stampabili, probabilmente vedrai qualcosa di simile:
N\bNA\bAM\bME\bE
Cioè, ogni personaggio è scritto come X
Backspace X
. Sui terminali moderni, il personaggio finisce per essere scritto su se stesso (poiché Backspace aka BS aka \b
aka ^H
è il personaggio che sposta il cursore di una colonna a sinistra) senza alcuna differenza. Ma negli antichi tele-macchine da scrivere, ciò farebbe apparire il personaggio in grassetto poiché ottiene il doppio di inchiostro.
Tuttavia, ai cercapersone piace more
/ less
capisce che quel formato significhi grassetto, quindi è ancora ciò che roff
fa produrre grassetto.
Alcune implementazioni man chiamerebbero roff
in modo tale che quelle sequenze non vengano utilizzate (o chiamate internamente col -b -p -x
per eliminarle come nel caso man-db
dell'implementazione (a meno che non MAN_KEEP_FORMATTING
sia impostata la variabile d'ambiente)) e non invochino un cercapersone quando rilevano l'output non sta andando a un terminale (quindi man bash | grep NAME
funzionerebbe lì), ma non il tuo.
Puoi usare col -b
per rimuovere quelle sequenze (ci sono anche altri tipi ( _
BS X
) per sottolineare).
Per i sistemi che usano GNU roff
(come GNU o FreeBSD), puoi evitare di usare quelle sequenze in primo luogo assicurandoti che le -c -b -u
opzioni siano passate grotty
, ad esempio assicurandoti che le -P-cbu
opzioni siano passate a groff
.
Ad esempio creando uno script wrapper chiamato groff
contenente:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Che hai inserito in / usr / bin / groff $PATH
.
Con macOS ' man
(anche usando GNU roff
), puoi creare un man-no-overstrike.conf
con:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
E chiama man
come:
man -C man-no-overstrike.conf bash | grep NAME
Sempre con GNU roff
, se si imposta la GROFF_SGR
variabile di ambiente (o non si imposta la GROFF_NO_SGR
variabile a seconda di come sono stati impostati i valori predefiniti al momento della compilazione), allora grotty
(purché non venga passata l' -c
opzione) si useranno invece le sequenze di escape del terminale SGR ANSI di quei trucchi BS per gli attributi dei personaggi. less
capirli quando viene chiamato con l' -R
opzione.
L'uomo di FreeBSD chiama grotty
con l' -c
opzione a meno che tu non stia chiedendo i colori impostando la variabile MANCOLOR (nel qual caso -c
non viene passato grotty
e grotty
ritorna all'impostazione predefinita usando le sequenze di escape ANSI SGR).
MANCOLOR=1 man bash | grep NAME
lavorerà lì.
Su Debian, GROFF_SGR non è l'impostazione predefinita. Se fate:
GROFF_SGR=1 man bash | grep NAME
tuttavia, poiché lo man
stdout non è un terminale, si assume anche il compito di passare una GROFF_NO_SGR
variabile a grotty
(suppongo che possa essere utilizzata col -bpx
per rimuovere le sequenze BS poiché col
non sa come rimuovere le sequenze SGR, anche se è ancora lo fa con MAN_KEEP_FORMATTING
) che sovrascrive il nostro GROFF_SGR
. Puoi invece fare:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(in un terminale) per avere le sequenze di escape SGR.
Quella volta, noterai che alcuni di questi NAME appaiono in grassetto sul terminale (e in un less -R
cercapersone). Se dai l'output a sed -n l
( MANPAGER='sed -n /NAME/l'
), vedrai qualcosa di simile a:
\033[1mNAME\033[0m$
Dov'è \e[1m
la sequenza per abilitare il grassetto nei terminali compatibili ANSI e \e[0m
la sequenza per ripristinare tutti gli attributi SGR sui valori predefiniti.
Su quel testo grep NAME
funziona come quel testo contiene NAME
, ma potresti ancora avere problemi se cerchi un testo in cui solo parti di esso sono in grassetto / sottolineato ...