Si vous ajoutez un | sed -n l
à cette tail
commande, pour afficher des caractères non imprimables, vous verrez probablement quelque chose comme:
N\bNA\bAM\bME\bE
Autrement dit, chaque caractère est écrit comme X
Backspace X
. Sur les terminaux modernes, le personnage finit par être écrit sur lui-même (comme Backspace aka BS aka \b
aka ^H
est le personnage qui déplace le curseur d'une colonne vers la gauche) sans différence. Mais dans les anciennes machines à écrire, cela ferait apparaître le caractère en gras car il obtient deux fois plus d'encre.
Pourtant, les pagers aiment more
/ less
comprennent ce format comme signifiant gras, c'est donc ce qui roff
fait pour produire du texte en gras.
Certaines implémentations man appellent roff
de manière à ce que ces séquences ne soient pas utilisées (ou appellent en interne col -b -p -x
pour les supprimer comme dans le cas de l' man-db
implémentation (à moins que la MAN_KEEP_FORMATTING
variable d'environnement ne soit définie)), et n'invoquent pas de pager lorsqu'elles détectent la sortie ne va pas à un terminal (donc man bash | grep NAME
fonctionnerait là-bas), mais pas le vôtre.
Vous pouvez utiliser col -b
pour supprimer ces séquences (il existe également d'autres types ( _
BS X
) pour souligner).
Pour les systèmes utilisant GNU roff
(comme GNU ou FreeBSD), vous pouvez éviter que ces séquences soient utilisées en premier lieu en vous assurant que les -c -b -u
options sont passées à grotty
, par exemple en vous assurant que les -P-cbu
options sont passées à groff
.
Par exemple en créant un script wrapper appelé groff
contenant:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Que vous placez devant / usr / bin / groff $PATH
.
Avec macOS ' man
(utilisant également GNU roff
), vous pouvez créer un man-no-overstrike.conf
avec:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
Et appelez man
comme:
man -C man-no-overstrike.conf bash | grep NAME
Toujours avec GNU roff
, si vous définissez la GROFF_SGR
variable d'environnement (ou si vous ne définissez pas la GROFF_NO_SGR
variable en fonction de la façon dont les valeurs par défaut ont été définies au moment de la compilation), alors grotty
(tant qu'elle n'est pas transmise, l' -c
option) utilisera des séquences d'échappement du terminal ANSI SGR à la place. de ces astuces BS pour les attributs de personnage. less
les comprendre lorsqu'ils sont appelés avec l' -R
option.
L'homme de FreeBSD appelle grotty
avec l' -c
option à moins que vous ne demandiez des couleurs en définissant la variable MANCOLOR (auquel cas il -c
n'est pas passé à grotty
et grotty
revient à la valeur par défaut de l'utilisation des séquences d'échappement ANSI SGR là-bas).
MANCOLOR=1 man bash | grep NAME
fonctionnera là-bas.
Sur Debian, GROFF_SGR n'est pas la valeur par défaut. Si tu fais:
GROFF_SGR=1 man bash | grep NAME
cependant, parce que man
stdout n'est pas un terminal, il prend sur lui de passer également une GROFF_NO_SGR
variable à grotty
(je suppose donc qu'il peut utiliser col -bpx
pour supprimer les séquences BS car col
il ne sait pas comment supprimer les séquences SGR, même s'il reste le fait avec MAN_KEEP_FORMATTING
) qui l'emporte sur notre GROFF_SGR
. Vous pouvez faire à la place:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(dans un terminal) pour avoir les séquences d'échappement SGR.
Cette fois, vous remarquerez que certains de ces NOM apparaissent en gras sur le terminal (et dans un less -R
pager). Si vous alimentez la sortie en sed -n l
( MANPAGER='sed -n /NAME/l'
), vous verrez quelque chose comme:
\033[1mNAME\033[0m$
Où \e[1m
est la séquence pour activer le gras dans les terminaux compatibles ANSI, et \e[0m
la séquence pour rétablir tous les attributs SGR par défaut.
Sur ce texte grep NAME
fonctionne comme ce texte contient NAME
, mais vous pouvez toujours avoir des problèmes si vous recherchez du texte dont seules certaines parties sont en gras / souligné ...