Jak wyszukiwać wzór zawierający łączniki wewnątrz stron podręcznika?

11

Próbuję znaleźć polecenie, aby wyszukać wzorzec zawierający łączniki na wszystkich stronach podręcznika.

Obejrzałem man mani znalazłem te 3 opcje:

-K, --global-apropos

Wyszukaj tekst na wszystkich stronach podręcznika. Jest to poszukiwanie brutalnej siły i prawdopodobnie zajmie to trochę czasu; jeśli możesz, powinieneś określić sekcję, aby zmniejszyć liczbę stron, które należy przeszukać. Wyszukiwane hasła mogą być prostymi ciągami (domyślnie) lub wyrażeniami regularnymi, jeśli --regexzostanie użyta opcja.

-w, --where, --path,--location

Nie wyświetlaj stron podręcznika, ale wydrukuj lokalizację źródłowych plików nroff, które zostaną sformatowane.

-S list, -s list,t--sections=list

Lista jest oddzieloną dwukropkami lub przecinkami listą sekcji instrukcji, które mają być wyszukiwane. Ta opcja zastępuje $MANSECTzmienną środowiskową. ( -sPisownia dotyczy zgodności z systemem V.)

Próbowałem je połączyć, aby wyszukać wzór, mark-modified-linesktóry jest opcją readline opisaną w man bash:

$ man -s1 -Kw mark-modified-lines

Ale nie znajduje żadnej strony:

No manual entry for mark-modified-lines

Polecenie kończy się wraz z kodem 16.
Pomyślałem, że może składnia polecenia jest niepoprawna, ale wydaje się, że tak nie jest, ponieważ to polecenie poprawnie odnajduje 5 stron podręcznika w moim systemie, które zawierają słowo guitar:

$ man -s1 -Kw guitar

  /usr/share/man/man1/ffmpeg-all.1.gz
  /usr/share/man/man1/ffserver-all.1.gz
  /usr/share/man/man1/ffplay-all.1.gz
  /usr/share/man/man1/ffmpeg-filters.1.gz
  /usr/share/man/man1/ffprobe-all.1.gz

Pomyślałem, że może myślniki w tym słowie powodują problem. W man bashznalazłem --regexopcję, która jest opisana w następujący sposób:

--regex

Pokaż wszystkie strony z dowolną częścią ich nazw lub opisów pasujących do każdego argumentu strony jako wyrażenie regularne, jak w przypadku apropos(1). Ponieważ zazwyczaj nie ma rozsądnego sposobu wybrania „najlepszej” strony podczas wyszukiwania wyrażenia regularnego, ta opcja implikuje -a.

Próbowałem użyć tej opcji i zastąpić słowo mark-modified-lineswyrażeniem regularnym mark.modified.lines, gdzie myślniki są zastępowane metaznakiem, .który powinien pasować do dowolnego znaku:

$ man -s1 -Kw --regex 'mark.modified.lines'

Nadal nie drukuje żadnej strony, podczas gdy wiem, że tekst jest zapisany na bashstronie podręcznika .

Metaznak .w wyrażeniu regularnym wydaje się być analizowany zgodnie z oczekiwaniami, ponieważ to polecenie:

$ man -s1 -Kw --regex 'mark.mo'

Wydruki:

  /usr/share/man/man1/x11perfcomp.1.gz
  /usr/share/man/man1/xditview.1.gz

I te 2 strony ( x11perfcomp, xditview) są dopasowane do wyrażenia regularnego mark.mo. W szczególności man x11perfcompzawiera ten wiersz:

Mark Moraes wrote the original scripts to compare servers.
^^^^^^^

I man xditviewzawiera tę linię:

    Mark Moraes (University of Toronto)
    ^^^^^^^

Jednak man -s1 -Kw --regex 'mark.mo'nie drukuje strony podręcznika bash:

/usr/share/man/man1/bash.1.gz

Oczekiwałem, że tak, ponieważ zawiera ten wiersz:

mark-modified-lines (Off)
^^^^^^^

Czy można wyszukać wzorzec zawierający łączniki wewnątrz stron podręcznika?

użytkownik938271
źródło

Odpowiedzi:

15

man -Kprzeszukuje kod źródłowy stron podręcznika, a nie ich renderowaną formę (wyświetlaną przez man). Łączniki są zakodowane \-, więc musisz poszukać:

man -s1 -Kw 'mark\-mo'

Tak, to raczej niejasne. Strona manman wspomina w opisie -Kopcji, że

Pamiętaj, że przeszukuje źródła stron podręcznika, a nie renderowany tekst, dlatego może zawierać fałszywe alarmy z powodu takich rzeczy, jak komentarze w plikach źródłowych. Wyszukiwanie renderowanego tekstu byłoby znacznie wolniejsze.

ale prawidłowe użycie tego wymaga znajomości reprezentacji źródłowej szukanego tekstu.

Stephen Kitt
źródło
1
Niejasny? Tak. To także błąd.
kubańczyk
@Kubańczyk cóż, pasuje do specyfikacji, ale tak, zgodziłbym się, że specyfikacja jest wadliwa ;-).
Stephen Kitt