Wenn Sie | sed -n l
diesem tail
Befehl ein hinzufügen , um nicht druckbare Zeichen anzuzeigen, wird wahrscheinlich Folgendes angezeigt:
N\bNA\bAM\bME\bE
Das heißt, jedes Zeichen wird als X
Rücktaste geschrieben X
. Auf modernen Terminals wird das Zeichen ohne Unterschied über sich selbst geschrieben (da Backspace aka BS aka \b
aka ^H
das Zeichen ist, das den Cursor eine Spalte nach links bewegt). Aber in alten Teleschreibmaschinen würde dies dazu führen, dass das Zeichen fett dargestellt wird, da es doppelt so viel Tinte erhält.
Trotzdem verstehen Pager wie more
/ less
, dass dieses Format fett bedeutet, und das ist es auch, was roff
zur Ausgabe von fettem Text verwendet wird.
Einige Implementierungen rufen roff
diese Sequenzen so auf, dass sie nicht verwendet werden (oder rufen col -b -p -x
sie intern auf, um sie wie im Fall der man-db
Implementierung zu entfernen (es sei denn, die MAN_KEEP_FORMATTING
Umgebungsvariable ist festgelegt)), und rufen keinen Pager auf, wenn sie die Ausgabe erkennen Ich gehe nicht zu einem Terminal ( man bash | grep NAME
würde dort also funktionieren), aber nicht zu deinem.
Sie können col -b
diese Sequenzen entfernen (es gibt auch andere Typen ( _
BS X
) zum Unterstreichen).
Bei Systemen, die GNU verwenden roff
(wie GNU oder FreeBSD), können Sie verhindern, dass diese Sequenzen an erster Stelle verwendet werden, indem Sie sicherstellen, dass die -c -b -u
Optionen an übergeben werden grotty
, beispielsweise indem Sie sicherstellen, dass die -P-cbu
Optionen an übergeben werden groff
.
Zum Beispiel durch Erstellen eines Wrapper-Skripts mit dem Namen „ groff
Enthält:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Das hast du vor / usr / bin / groff gesetzt $PATH
.
Mit macOS ' man
(auch mit GNU roff
) können Sie ein man-no-overstrike.conf
mit:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
Und ruf an man
als:
man -C man-no-overstrike.conf bash | grep NAME
roff
Wenn Sie bei GNU die GROFF_SGR
Umgebungsvariable festlegen (oder die GROFF_NO_SGR
Variable nicht festlegen , je nachdem, wie die Standardeinstellungen zum Zeitpunkt der Kompilierung festgelegt wurden), werden stattdessen grotty
(sofern diese -c
Option nicht übergeben wird ) Escape-Sequenzen für ANSI SGR-Terminals verwendet dieser BS-Tricks für Zeichenattribute. less
Verstehe sie, wenn sie mit der -R
Option aufgerufen werden .
Der Benutzer von FreeBSD ruft grotty
mit der -c
Option auf, es sei denn, Sie fordern Farben an, indem Sie die Variable MANCOLOR setzen (in diesem Fall -c
wird die Verwendung von ANSI SGR-Escape-Sequenzen dort nicht übernommen grotty
und grotty
auf die Standardeinstellung zurückgesetzt).
MANCOLOR=1 man bash | grep NAME
wird dort arbeiten.
Unter Debian ist GROFF_SGR nicht die Standardeinstellung. Wenn Sie tun:
GROFF_SGR=1 man bash | grep NAME
Da es sich man
bei stdout jedoch nicht um ein Terminal handelt, muss auch eine GROFF_NO_SGR
Variable an übergeben werden grotty
(ich nehme an, damit können col -bpx
die BS-Sequenzen entfernt werden, da col
nicht bekannt ist, wie die SGR-Sequenzen entfernt werden, obwohl dies immer noch der Fall ist tut es mit MAN_KEEP_FORMATTING
) was unser überschreibt GROFF_SGR
. Sie können stattdessen Folgendes tun:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(in einem Terminal), um die SGR-Escape-Sequenzen zu erhalten.
Dieses Mal werden Sie feststellen, dass einige dieser NAMEN auf dem Terminal (und in einem less -R
Pager) fett gedruckt sind. Wenn Sie die Ausgabe an sed -n l
( MANPAGER='sed -n /NAME/l'
) weiterleiten, wird Folgendes angezeigt:
\033[1mNAME\033[0m$
Wo \e[1m
ist die Reihenfolge, in der in ANSI-kompatiblen Terminals Fettdruck aktiviert werden soll, und \e[0m
die Reihenfolge, in der alle SGR-Attribute auf die Standardwerte zurückgesetzt werden sollen?
Dieser Text grep NAME
funktioniert so wie der Text enthält NAME
, aber Sie könnten trotzdem Probleme haben, wenn Sie nach Text suchen, bei dem nur Teile davon fett / unterstrichen sind ...