정규식 ".*word1.*word2.*"에 대한 매뉴얼 페이지 전역 검색에서는 이 두 단어가 포함된 페이지를 찾을 수 없습니다.

정규식 ".*word1.*word2.*"에 대한 매뉴얼 페이지 전역 검색에서는 이 두 단어가 포함된 페이지를 찾을 수 없습니다.

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

구현 manman-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

perltextdomain및 대소문자를 구분하는 매뉴얼 페이지를 검색하려면 다음을 수행할 수 있습니다(GNU 시스템에서):

xargs -rd '\n' -a <(
  man -IKw perl | sort -u | xargs -rd '\n' zgrep -l textdomain --
  ) man -l --

perlman -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

관련 정보