Якщо ви додасте | sed -n lдо цієї tailкоманди, щоб показати символи, що не друкуються, ви, ймовірно, побачите щось на зразок:
N\bNA\bAM\bME\bE
Тобто кожен символ пишеться як XBackspace X. На сучасних терміналах символ в кінцевому підсумку пишеться над собою (як Backspace aka BS aka \baka ^H- символ, який переміщує курсор на один стовпець ліворуч) без різниці. Але в стародавніх машинках-машинках це може призвести до того, що персонаж з'являється жирним шрифтом, оскільки він отримує вдвічі більше чорнила.
Тим не менш, пейджери на зразок more/ lessдій розуміють, що цей формат означає жирний, так що це все ще roffозначає, що виводити жирний текст.
Деякі реалізовані люди закликають 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опція) замість цього використовуватиметься послідовність аварійних терміналів ANSI SGR з цих хитрощів BS для атрибутів символів. lessзрозуміти їх, коли викликається з -Rопцією.
Чоловік FreeBSD зателефонує за grottyдопомогою цієї -cопції, якщо ви не вимагаєте кольорів , встановивши змінну MANCOLOR (у такому випадку -cне передається grottyта grottyповертається до типового використання там, де використовуються послідовності відбору ANSI SGR).
MANCOLOR=1 man bash | grep NAME
буде працювати там.
У Debian GROFF_SGR не є типовим. Якщо ти зробиш:
GROFF_SGR=1 man bash | grep NAME
однак, оскільки manstdout 's не є терміналом, він бере на себе також передачу GROFF_NO_SGRзмінної grotty(я вважаю, що вона може використовувати col -bpxдля зчитування послідовностей BS, оскільки colне знає, як знімати послідовності SGR, хоча вона все ще є робить це з MAN_KEEP_FORMATTING), що перекриває наше GROFF_SGR. Ви можете зробити замість цього:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(у терміналі), щоб мати послідовності втечі SGR.
Цього разу ви помітите, що деякі з цих імен з’являються жирним шрифтом на терміналі (і в less -Rпейджері). Якщо ви подаєте вихід на sed -n l( MANPAGER='sed -n /NAME/l'), ви побачите щось на кшталт:
\033[1mNAME\033[0m$
Де \e[1mпослідовність включення жирних в ANSI-сумісних терміналів, і \e[0mпослідовність для повернення всіх атрибутів SGR до стандартних.
Цей текст grep NAMEпрацює так, як цей текст містить NAME, але у вас все ще можуть виникнути проблеми, якщо шукати текст, де лише його частини виділено жирним шрифтом / підкреслюють ...