Почему заголовки разделов справочных страниц не полностью доступны для поиска?

Это было протестировано в El Capitan и в High Sierra коллеги в стандартном терминале (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'').

Чтобы уточнить: «ОШИБКИ» — это заголовок раздела на этой (и других) справочных страницах. Для заголовков разделов поиск работает только для первых двух символов; это согласуется с несколькими названиями разделов, которые мы пробовали. Для остального контента, grepкажется, работает так, как ожидалось.

Я подключился по ssh к Linux-системе, отличной от BSD (Amazon Linux), и, похоже, она не ведет себя так же.

Что тут происходит?

Это одна из причин, по которой я ненавижу человека с BSD. Он форматирует текст и запускает пейджер, даже если его вывод представляет собой канал. И мой пейджер - vim, так что, не дай мне Линус man foo | grep bar, я получаю не отвечающий конвейер (и, возможно, испорченный терминал для загрузки). :/ mandb man , который вы обычно видите в Linux, более разумен.
unix.stackexchange.com/questions/371062 также является вопросом MacOS.

Ответы (1)

Вы можете увидеть, что происходит, если просмотрите необработанные коды на странице руководства. Один из способов сделать это — экспортировать справочную страницу в файл и напрямую проверить его содержимое:

man ls > man.ls
nano man.ls

Слово «ОШИБКИ» на самом деле выглядит в файле так:

B^HBU^HUG^HGS^HS

Вы увидите, что заголовки содержат символы форматирования, поэтому слово «ОШИБКИ» отсутствует целиком.


Если вы хотите получить доступ к текстовому содержимому страницы руководства, вы можете использовать команду

man -P cat <thepage>

Опция -Pустанавливает пейджер на другом unix и catбудет игнорировать информацию о форматировании, давая вывод в виде открытого текста. Однако это не работает в macOS, поэтому для вывода требуется ручной col -bшаг в конвейере:

man ls | col -b | grep BUGS
Спасибо, Скот! Первым делом я должен был попробовать перенаправить в файл и открыть его в текстовом редакторе. Используя эту информацию и информацию с unix.stackexchange.com/a/15866 (т.е. man ls | col -b | grep "BUGS"), я смог получить то, что хотел.
Боже мой, полужирный шрифт — это старая эра TTY и пишущих машинок, введите букву, нажмите клавишу Backspace и снова введите букву, зная, что они не будут идеально выровнены и нанесут больше чернил. Должна быть nroffкоманда для перевода, если вам нужно grep- не возражаете, если я дополню это тем, как передать правильную команду в groffvia man?
@Kroltan +10 и +10 тоже. Это намного элегантнее, чем то, как я не думал о том, чтобы содрать шкуру с этого конкретного кота.
@Kroltan Хммм - для меня man -P cat ls | grep BUGSработает идентично man ls | grep BUGS, оба ничего не возвращают.
@Kroltan Пейджер - это не та часть, которую вам нужно заменить, - это касается только случаев, когда вывод не помещается на экране, поэтому он появляется после того, как troff/ groff/ nroffотформатировал вывод. Также недостаточно удалить символы возврата (вы получите «BBUUGGSS»), вам нужно в первую очередь убедить средство форматирования не генерировать их.
Совет man manпредлагает направить вывод col -b, чтобы разумно удалить пробелы, и man ls | col -b | grep BUGSдействительно работает в моей системе (CentOS Linux). Не уверен, что эта команда доступна в MacOS.
Почему бы не искать в пейджере по умолчанию man -P "less -p BUGS" ls?
@IMSoP хм, тогда должны быть системные различия, я проверил это в Arch, и поиск ОШИБОК сработал. Виноват.
Для ручных систем, использующих GNU roff, действительно есть варианты, grottyкоторые не позволят ему выдавать управляющие последовательности TTY-37 или ECMA48.