man
좀 더 효율적으로 사용하고 싶습니다 . 나는 그것을 시도해 보기로 결정했다 --regex
. 하지만:
~$ man --regex -K '.*textdomain.*perl.*'
--Man-- next: Locale::Messages(3pm) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
^C
~$ man --regex -K '.*perl.*textdomain.*'
No manual entry for .*perl.*textdomain.*
내가 추출한 소스 코드(어느 것이 먼저 열렸는지 찾기)는 빈 grep 결과를 생성하지만 단어(textdomain, perl)를 별도로 찾습니다.
~/Documents$ grep '.*textdomain.*perl.*' Locale\:\:libintlFAQ.3pm
~/Documents$ grep '.*perl.*textdomain.*' Locale\:\:libintlFAQ.3pm
perl
이 파일에서는(예: 74행) textdomain
(예: 120행) 앞에 옵니다. man --regex -K '.*perl.*textdomain.*'
단어가 역순으로 되어 있으면 왜 찾을 수 없나요? grep
두 시퀀스 모두 한 줄에 표시되지 않습니다. 실제로 어떻게 man --regex -K
작동하나요? .*
새로운 길을 찾아야 할까요 ? 마지막 대답은 "시스템에 따라 다릅니다"라고 생각합니다.https://stackoverflow.com/questions/11924480/search-in-man-page-for-words-at-the-beginning-of-line).
답변1
구현 man
중man-db
대부분의 GNU/Linux 배포판에서 볼 수 있듯이 검색은 다음과 같습니다.행 기반그리고기본적으로 대소문자를 구분하지 않음-I
( / 옵션을 전달하지 않는 한 --match-case
).
$ man -Iw --regex -K '.*textdomain.*perl.*'
No manual entry for .*textdomain.*perl.*
$ man -w --regex -K '.*textdomain.*perl.*'
/usr/share/man/man3/Locale::libintlFAQ.3pm.gz
/usr/share/man/man3/Locale::TextDomain.3pm.gz
/usr/share/man/man3/Locale::libintlFAQ.3pm.gz
/usr/share/man/man3/Locale::TextDomain.3pm.gz
$ zgrep '.*textdomain.*perl.*' /usr/share/man/man3/Locale::libintlFAQ.3pm.gz
$ zgrep -i '.*textdomain.*perl.*' /usr/share/man/man3/Locale::libintlFAQ.3pm.gz
Locale::TextDomain::FAQ \- Frequently asked questions for libintl\-perl
perl
및 textdomain
및 대소문자를 구분하는 매뉴얼 페이지를 검색하려면 다음을 수행할 수 있습니다(GNU 시스템에서):
xargs -rd '\n' -a <(
man -IKw perl | sort -u | xargs -rd '\n' zgrep -l textdomain --
) man -l --
perl
man -IKw
해당 파일이 포함된 매뉴얼 페이지에 대한 경로를 반환하는 검색을 수행하고 , textdomain
해당 파일 내에서 검색하고 zgrep
, 에 대한 결과 경로 목록을 제공합니다 man -l
.
스크립트는 man-pages-with-all-words
다음과 같이 작성할 수 있습니다.
#! /bin/zsh -
die() {
print -rC1 -u2 - "$@"
exit 1
}
(( $# )) || die "Usage: $ZSH_SCRIPT <word> [<word>...]"
typeset -U pages
pages=(
${(f)"$(man -IKw -- "$1")"}
)
shift
while (( $#pages && $# )); do
pages=(
${(f)"$(zgrep -lF -- "$1" $pages)"}
)
shift
done
if (( $#pages )); then
man -l -- $pages
else
die "No matching man page found."
fi
sh
또는 POSIX 구문과 동일합니다.
#! /bin/sh -
die() {
[ "$#" -eq 0 ] || printf '%s\n' "$@"
exit 1
}
[ "$#" -gt 0 ] || die "Usage: $0 <word> [<word>...]"
# tune sh split+glob: split on (sequences of) newline + no glob
IFS='
'; set -o noglob
pages=$(man -IKw -- "$1" | LC_ALL=C sort -u)
shift
while [ "$#" -gt 0 ] && [ -n "$pages" ]; do
pages=$(
zgrep -lF -- "$1" $pages
)
shift
done
if [ -n "$pages" ]; then
man -l -- $pages
else
die "No matching man page found."
fi