Если вы добавите | sed -n lк этой tailкоманде, чтобы показать непечатаемые символы, вы, вероятно, увидите что-то вроде:
N\bNA\bAM\bME\bE
То есть каждый символ записывается как XBackspace 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
однако, поскольку manstdout не является терминалом, он также берет на себя передачу 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, но у вас все еще могут быть проблемы, если вы ищете текст, где только его части выделены жирным шрифтом / подчеркиванием ...