Grep не соответствует определенным частям страницы man - PullRequest
0 голосов
/ 23 июня 2019

Grep не соответствует определенным строкам из man вывода. Кажется, это случайно, потому что я не могу понять, рифма или причина того, будет ли строка соответствовать или нет.

man sed | head -7:

SED(1)                    BSD General Commands Manual                   SED(1)

NAME
     sed -- stream editor

SYNOPSIS
$ man sed | head -7 | grep sed # no match

$ man sed | head -7 | grep stream # match on "stream"
     sed -- stream editor

$ man sed | head -7 | grep '\-\-' # match on "--"
     sed -- stream editor

$ man sed | head -7 | grep NAME # no match

$ man sed | head -7 | grep SYNOPSIS # no match

Это также происходит при перенаправлении выходных данных в файл и отображении

$ man sed | head -7 > /tmp/sed.man

$ cat /tmp/sed.man | grep sed # no match

$ cat /tmp/sed.man | grep stream # match on "stream"
     sed -- stream editor

$ grep sed /tmp/sed.man # no match

$ grep stream /tmp/sed.man # match on "stream"
     sed -- stream editor

grep: grep (BSD grep) 2.5.1-FreeBSD
человек: версия 1.6c
macOS: 10,14,6 бета
bash: GNU bash, версия 5.0.7 (1) -релиз (x86_64-apple-darwin18.5.0)

$ man sed | head -7 | hexdump -C
00000000  0a 53 45 44 28 31 29 20  20 20 20 20 20 20 20 20  |.SED(1)         |
00000010  20 20 20 20 20 20 20 20  20 20 20 42 53 44 20 47  |           BSD G|
00000020  65 6e 65 72 61 6c 20 43  6f 6d 6d 61 6e 64 73 20  |eneral Commands |
00000030  4d 61 6e 75 61 6c 20 20  20 20 20 20 20 20 20 20  |Manual          |
00000040  20 20 20 20 20 20 20 20  20 53 45 44 28 31 29 0a  |         SED(1).|
00000050  0a 4e 08 4e 41 08 41 4d  08 4d 45 08 45 0a 20 20  |.N.NA.AM.ME.E.  |
00000060  20 20 20 73 08 73 65 08  65 64 08 64 20 2d 2d 20  |   s.se.ed.d -- |
00000070  73 74 72 65 61 6d 20 65  64 69 74 6f 72 0a 0a 53  |stream editor..S|
00000080  08 53 59 08 59 4e 08 4e  4f 08 4f 50 08 50 53 08  |.SY.YN.NO.OP.PS.|
00000090  53 49 08 49 53 08 53 0a                           |SI.IS.S.|
00000098

Гуглить трудно для этой проблемы, так как любая комбинация "man" или "grep" не упоминает мою проблему, что строки (без специальных символов) не совпадают.

Ответы [ 2 ]

1 голос
/ 23 июня 2019

macOS man не поддерживает флаг --ascii, поэтому я использовал col -bx, чтобы убрать раздражающее форматирование из man для передачи в другие команды.

man sed | col -bx | grep SYNOPSIS

col -b: не выводить никаких символов возврата, печатая только последний символ, записанный в каждой позиции столбца.
col -x: вывод нескольких пробелов вместо табуляции.

Примечания:
Я читал, что этот человек предназначен для определения, передаете ли вы какую-либо команду или файл, и т. Д., Но это был не мой опыт. По крайней мере для man 1.6c по умолчанию для macOS.
Решение с использованием col: https://unix.stackexchange.com/a/15866
Спасибо @Cyrus - я не знал о hexdump
Спасибо @Oliver Gaida - я не знал, что cat и vi будут отображаться по-другому

1 голос
/ 23 июня 2019

man-страниц используют формат roff (https://man.openbsd.org/roff).. Выполните следующие действия:

man sed > sed.man
vi sed.man

, чтобы вы увидели:

SED(1)                    BSD General Commands Manual                   SED(1)

N^HNA^HAM^HME^HE
     s^Hse^Hed^Hd -- stream editor

для преобразованиястраницы к тексту без ^ H-материала. посмотрите на http://www.schweikhardt.net/man_page_howto.html#q10

создайте Perl-Skript с именем strip-headers с содержанием:

#!/usr/bin/perl -wn
#  make it slurp the whole file at once:
undef $/;
#  delete first header:
s/^\n*.*\n+//;
#  delete last footer:
s/\n+.*\n+$/\n/g;
#  delete page breaks:
s/\n\n+[^ \t].*\n\n+(\S+).*\1\n\n+/\n/g;
#  collapse two or more blank lines into a single one:
s/\n{3,}/\n\n/g;
#  see what is left...
print;

измените права наPerl-скрипт chmod 750 strip-headers и запустить его с:

man sed | ./strip-headers | col -bx > sed.man

или

man sed | ./strip-headers | col -bx | head -7 | grep sed
...