Me encuentro con un comportamiento extraño al intentar grep una página de manual en macOS. Por ejemplo, la página de manual de Bash claramente tiene una aparición de la cadena NAME:
$ man bash | head -5 | tail -1
NAME
Y si busco name, obtengo resultados, pero si NAMEbusco, no:
$ man bash | grep 'NAME'
$ man bash | grep NAME
He intentado otras palabras en mayúscula que sé que están allí, y la búsqueda de SHELLresultados no produce nada mientras que la búsqueda de BASHresultados arroja resultados.
¿Que está pasando aqui?
Actualización : ¡Gracias por todas las respuestas! Pensé que valía la pena agregar el contexto en el que me encontré con esto. Quería escribir una función bash para ajustar many, en los casos en que he intentado buscar la página del manual para un shell incorporado, salte a la sección correspondiente de la página del manual de Bash. Puede haber una mejor manera, pero esto es lo que tengo actualmente:
man () {
case "$(type -t "$1")" in
builtin)
local pattern="^ *$1"
if bashdoc_match "$pattern \+[-[]"; then
command man bash | less --pattern="$pattern +[-[]"
elif bashdoc_match "$pattern\b"; then
command man bash | less --pattern="$pattern[[:>:]]"
else
command man bash
fi
;;
keyword)
command man bash | less --hilite-search --pattern='^SHELL GRAMMAR$'
;;
*)
command man "$@"
;;
esac
}
bashdoc_match() {
command man bash | col -b | grep -l "$1" > /dev/null
}
fuente

man bash | grep NAMEFunciona como se esperaba.helpcomando bash para obtener su información.helpresultados dejan demasiado afuera. Echa un vistazo ahelp completelacompletesección enman bash, por ejemplo.Respuestas:
Si agrega un comando
| sed -n la esetailcomando, para mostrar caracteres no imprimibles, probablemente verá algo como:Es decir, cada personaje está escrito como
XRetrocesoX. En las terminales modernas, el personaje termina siendo escrito sobre sí mismo (como Backspace aka BS aka\baka^Hes 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/lessentienden que el formato significa negrita, por lo que sigue siendo esorofflo que hace que el texto aparezca en negrita.Algunas implementaciones de hombre llamarían
roffde una manera que esas secuencias no se usan (o llamarían internamentecol -b -p -xpara despojarlas como en el caso de laman-dbimplementación (a menos que se establezca laMAN_KEEP_FORMATTINGvariable de entorno)), y no invoquen un buscapersonas cuando detecten la salida no va a una terminal (porman bash | grep NAMElo que funcionaría allí), pero no a la suya.Puede usar
col -bpara eliminar esas secuencias (también hay otros tipos (_BSX) 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 -uque se pasen las opcionesgrotty, por ejemplo, asegurándose de-P-cbuque se pasen las opcionesgroff.Por ejemplo, creando una secuencia de comandos de contenedor llamada que
groffcontiene:Que pones delante de / usr / bin / groff
$PATH.Con macOS '
man(también usando GNUroff), puede crear unman-no-overstrike.confcon:Y llama
mancomo:Aún con GNU
roff, si establece laGROFF_SGRvariable de entorno (o no establece laGROFF_NO_SGRvariable dependiendo de cómo se hayan establecido los valores predeterminados en el momento de la compilación), entoncesgrotty(siempre que no se pase la-copción) utilizará secuencias de escape de terminal ANSI SGR en su lugar de esos trucos BS para atributos de personaje.lessComprenderlos cuando se llama con la-Ropción.El hombre de FreeBSD llama
grottycon la-copción a menos que esté pidiendo colores configurando la variable MANCOLOR (en cuyo caso-cno se pasagrottyygrottyvuelve al valor predeterminado de usar secuencias de escape ANSI SGR allí).Trabajaré allí.
En Debian, GROFF_SGR no es el valor predeterminado. Si lo haces:
sin embargo, debido a que
manstdout no es una terminal, se encarga de pasar también unaGROFF_NO_SGRvariable agrotty(supongo que puede usarsecol -bpxpara eliminar las secuencias BS yacolque no sabe cómo eliminar las secuencias SGR, aunque todavía lo hace conMAN_KEEP_FORMATTING) que anula nuestraGROFF_SGR. Puedes hacer en su lugar:(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 -Rbuscapersonas). Si alimenta la salida ased -n l(MANPAGER='sed -n /NAME/l'), verá algo como:¿Dónde
\e[1mestá la secuencia para habilitar negrita en terminales compatibles con ANSI y\e[0mla secuencia para revertir todos los atributos SGR al valor predeterminado?En ese texto
grep NAMEfunciona como ese texto contieneNAME, pero aún podría tener problemas si busca texto donde solo partes de él están en negrita / subrayado ...fuente
sed -n lcomo un sustituto deod.Si observa cualquier página del manual, notará que los encabezados están en negrita. Esto se logra formateándolos con caracteres de control. Para poder
grepgustar lo que quieres, estos deben ser eliminados.La
colutilidad se puede usar para esto:La
-bopción tiene la siguiente descripción en OpenBSD :Linux el
colmanual (en Ubuntu) no tiene la última oración allí (pero funciona de la misma manera).En Linux, desarmar la
MAN_KEEP_FORMATTINGvariable de entorno (o configurarlo en una cadena vacía) también puede ayudar, y le permitirá hacerlogrepsin pasar la salida de amantravéscol -b.fuente
NAMEmanual de bash es simplementeNAMEno\b.MAN_KEEP_FORMATTINGvariable funciona exactamente como tú dices. Solo quería señalar que ese no es siempre el caso.