Если вы добавите | sed -n l
к этой tail
команде, чтобы показать непечатаемые символы, вы, вероятно, увидите что-то вроде:
N\bNA\bAM\bME\bE
То есть каждый символ записывается как X
Backspace X
. На современных терминалах символ заканчивается написанием над собой (так как Backspace или BS, он \b
же aka ^H
- это символ, который перемещает курсор на один столбец влево) без разницы. Но в древних телетайпах это приводило к тому, что персонаж выделялся жирным шрифтом, поскольку чернил в два раза больше.
Тем не менее, пейджеры любят more
/ less
действительно понимают, что формат означает жирный шрифт, так что это по-прежнему то, roff
что выводит жирный текст
Некоторые реализации man вызывают roff
таким образом, что эти последовательности не используются (или внутренне вызывают col -b -p -x
для их удаления, как в случае man-db
реализации (если не установлена MAN_KEEP_FORMATTING
переменная окружения)), и не вызывают пейджер, когда обнаруживают вывод не собирается в терминал (так man bash | grep NAME
будет работать там), но не ваш.
Вы можете использовать col -b
для удаления этих последовательностей (есть и другие типы ( _
BS X
), а также для подчеркивания).
Для систем, использующих GNU roff
(например, GNU или FreeBSD), вы можете избежать использования этих последовательностей в первую очередь, убедившись, что -c -b -u
опции переданы grotty
, например, убедившись, что -P-cbu
опции переданы groff
.
Например, путем создания сценария-оболочки, который groff
содержит:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Что вы поставили перед / usr / bin / groff $PATH
.
С macOS ' man
(также с использованием GNU roff
) вы можете создать man-no-overstrike.conf
с:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
И называть man
как:
man -C man-no-overstrike.conf bash | grep NAME
Тем не менее, в GNU roff
, если вы установите GROFF_SGR
переменную среды (или не установите GROFF_NO_SGR
переменную в зависимости от того, как были установлены значения по умолчанию во время компиляции), тогда grotty
(если она не была передана -c
), вместо этого будут использоваться escape-последовательности терминала ANSI SGR из этих трюков BS для атрибутов персонажа. less
понять их при вызове с -R
опцией.
Человек FreeBSD вызывает grotty
с -c
опцией, если вы не запрашиваете цвета , устанавливая переменную MANCOLOR (в этом случае -c
она не передается grotty
и grotty
возвращается к использованию по умолчанию escape-последовательностей ANSI SGR).
MANCOLOR=1 man bash | grep NAME
будет работать там.
В Debian GROFF_SGR не используется по умолчанию. Если вы делаете:
GROFF_SGR=1 man bash | grep NAME
однако, поскольку man
stdout не является терминалом, он также берет на себя передачу GROFF_NO_SGR
переменной в grotty
(я полагаю, поэтому он может использовать col -bpx
для удаления последовательностей BS, поскольку col
не знает, как удалять последовательности SGR, даже если он все еще делает это с MAN_KEEP_FORMATTING
) который отменяет наш GROFF_SGR
. Вы можете сделать вместо этого:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(в терминале) иметь escape-последовательности SGR.
В этот раз вы заметите, что некоторые из этих ИМЯ отображаются на терминале жирным шрифтом (и на less -R
пейджере). Если вы передадите вывод в sed -n l
( MANPAGER='sed -n /NAME/l'
), вы увидите что-то вроде:
\033[1mNAME\033[0m$
Где \e[1m
последовательность включения жирного шрифта в ANSI-совместимых терминалах и \e[0m
последовательность для возврата всех атрибутов SGR к значениям по умолчанию.
Этот текст grep NAME
работает так же, как этот текст NAME
, но у вас все еще могут быть проблемы, если вы ищете текст, где только его части выделены жирным шрифтом / подчеркиванием ...