Si agrega un comando | sed -n l
a ese tail
comando, para mostrar caracteres no imprimibles, probablemente verá algo como:
N\bNA\bAM\bME\bE
Es decir, cada personaje está escrito como X
Retroceso X
. En las terminales modernas, el personaje termina siendo escrito sobre sí mismo (como Backspace aka BS aka \b
aka ^H
es el personaje que mueve el cursor una columna hacia la izquierda) sin diferencia. Pero en las máquinas de escribir antiguas, eso haría que el personaje apareciera en negrita, ya que recibe el doble de tinta.
Aún así, los localizadores como more
/ less
entienden que el formato significa negrita, por lo que sigue siendo eso roff
lo que hace que el texto aparezca en negrita.
Algunas implementaciones de hombre llamarían roff
de una manera que esas secuencias no se usan (o llamarían internamente col -b -p -x
para despojarlas como en el caso de la man-db
implementación (a menos que se establezca la MAN_KEEP_FORMATTING
variable de entorno)), y no invoquen un buscapersonas cuando detecten la salida no va a una terminal (por man bash | grep NAME
lo que funcionaría allí), pero no a la suya.
Puede usar col -b
para eliminar esas secuencias (también hay otros tipos ( _
BS X
) para subrayar).
Para los sistemas que usan GNU roff
(como GNU o FreeBSD), puede evitar que esas secuencias se usen en primer lugar asegurándose de -c -b -u
que se pasen las opciones grotty
, por ejemplo, asegurándose de -P-cbu
que se pasen las opciones groff
.
Por ejemplo, creando una secuencia de comandos de contenedor llamada que groff
contiene:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Que pones delante de / usr / bin / groff $PATH
.
Con macOS ' man
(también usando GNU roff
), puede crear un man-no-overstrike.conf
con:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
Y llama man
como:
man -C man-no-overstrike.conf bash | grep NAME
Aún con GNU roff
, si establece la GROFF_SGR
variable de entorno (o no establece la GROFF_NO_SGR
variable dependiendo de cómo se hayan establecido los valores predeterminados en el momento de la compilación), entonces grotty
(siempre que no se pase la -c
opción) utilizará secuencias de escape de terminal ANSI SGR en su lugar de esos trucos BS para atributos de personaje. less
Comprenderlos cuando se llama con la -R
opción.
El hombre de FreeBSD llama grotty
con la -c
opción a menos que esté pidiendo colores configurando la variable MANCOLOR (en cuyo caso -c
no se pasa grotty
y grotty
vuelve al valor predeterminado de usar secuencias de escape ANSI SGR allí).
MANCOLOR=1 man bash | grep NAME
Trabajaré allí.
En Debian, GROFF_SGR no es el valor predeterminado. Si lo haces:
GROFF_SGR=1 man bash | grep NAME
sin embargo, debido a que man
stdout no es una terminal, se encarga de pasar también una GROFF_NO_SGR
variable a grotty
(supongo que puede usarse col -bpx
para eliminar las secuencias BS ya col
que no sabe cómo eliminar las secuencias SGR, aunque todavía lo hace con MAN_KEEP_FORMATTING
) que anula nuestra GROFF_SGR
. Puedes hacer en su lugar:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(en un terminal) para tener las secuencias de escape SGR.
Esa vez, notará que algunos de esos NOMBRES aparecen en negrita en el terminal (y en un less -R
buscapersonas). Si alimenta la salida a sed -n l
( MANPAGER='sed -n /NAME/l'
), verá algo como:
\033[1mNAME\033[0m$
¿Dónde \e[1m
está la secuencia para habilitar negrita en terminales compatibles con ANSI y \e[0m
la secuencia para revertir todos los atributos SGR al valor predeterminado?
En ese texto grep NAME
funciona como ese texto contiene NAME
, pero aún podría tener problemas si busca texto donde solo partes de él están en negrita / subrayado ...