¿Por qué los títulos de las secciones de las páginas man no son completamente greppables?

14

Esto se probó en El Capitan y en la High Sierra de un colega, en la Terminal estándar (bash).

user@hostname ~ $ man ls | grep "BU"
BUGS
user@hostname ~ $ man ls | grep "BUG"
user@hostname ~ $ 
user@hostname ~ $ man ls | grep "IEEE"
     files in order to be compatible with the IEEE Std 1003.2 (``POSIX.2'')
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

Para aclarar: "BUGS" es un título de sección en esa (y varias otras) páginas de manual. Para los títulos de sección, grepping solo parece funcionar para los primeros 2 caracteres; Esto es consistente en algunos títulos de secciones diferentes que probamos. Para el resto del contenido, grepparece funcionar como se esperaba.

Me metí en una caja de Linux sin sabor BSD (Amazon Linux) y no parece mostrar el mismo comportamiento.

¿Que está pasando aqui?

Jonathan Merklin
fuente
Esto es parte de la razón por la que odio al hombre BSD. Formatea el texto y ejecuta el localizador incluso cuando su salida es una tubería. Y mi buscapersonas es vim, así que Linus me prohibió que lo hiciera alguna vez man foo | grep bar, obtengo una tubería que no responde (y tal vez un terminal desordenado para arrancar). : / mandb man , que es lo que normalmente se ve en Linux, es más sensato.
muru
unix.stackexchange.com/questions/371062 también es una pregunta de MacOS.
JdeBP

Respuestas:

15

Puede ver lo que está sucediendo si ve los códigos sin procesar dentro de una página de manual. Una forma de hacerlo es exportar la página de manual a un archivo e inspeccionar su contenido directamente:

man ls > man.ls
nano man.ls

La palabra "ERRORES" realmente se ve así en el archivo:

B^HBU^HUG^HGS^HS

Verá que los encabezados contienen caracteres de formato, por lo que la palabra completa "BUGS" no está presente.


Si desea acceder al contenido de texto sin formato de la página del manual, puede usar el comando

man -P cat <thepage>

La -Popción establece el buscapersonas en otro Unix e catignorará la información de formato, dando una salida de texto sin formato. Sin embargo, esto no parece funcionar en macOS, por lo que la salida necesita un col -bpaso manual en la tubería:

man ls | col -b | grep BUGS
escocés
fuente
2
Gracias escocés! Redirigir a un archivo y abrir en un editor de texto debería haber sido lo primero que intenté. Usando esa información y la información de unix.stackexchange.com/a/15866 (es decir man ls | col -b | grep "BUGS") pude obtener lo que quería.
Jonathan Merklin
77
Santo cielo, el negrita es el antiguo TTY y la era de la máquina de escribir, escribe una letra y retroceso y escribe la letra nuevamente, sabiendo que no se alinearán perfectamente y depositarán más tinta. Tiene que haber un nroffcomando para traducir eso si lo necesita grep , ¿le importaría si amplié esto con cómo pasar el comando correcto a grofftravés de man?
bmike
@Kroltan +10 y +10 para scot también. Eso es mucho más elegante que cómo no estaba pensando en desollar a este gato en particular.
bmike
@Kroltan Hmmm: para mí, man -P cat ls | grep BUGSfunciona de manera idéntica man ls | grep BUGS, ambos no devuelven nada.
Scot
1
Para los sistemas manuales que emplean GNU roff, existen opciones grottyque evitarán que emita secuencias de control TTY-37 o ECMA48.
JdeBP