"man -awK"에 검색어와 일치하지 않는 결과가 포함되는 이유는 무엇입니까?

"man -awK"에 검색어와 일치하지 않는 결과가 포함되는 이유는 무엇입니까?

예:

man -awK "typeset"

이는 파이프라인을 통해 확인되었습니다 grep.

search=typeset
man -awK -- "$search" | xargs -I {} sh -c "echo '{}'
    man --no-hyphenation --no-justification -- {} | grep -iF -- '$search'"

결과:

/usr/share/man/man1/lcf.1.gz
/usr/share/man/man1/memusagestat.1.gz
/usr/share/man/man1/mtrace.1.gz
/usr/share/man/man1/nm-applet.1.gz
/usr/share/man/man1/nm-connection-editor.1.gz
/usr/share/man/man1/nroff.1.gz
       작은 숲_조판TER 환경 변수 또는 -T 명령줄 옵션
       작은 숲_조판TER
              그리고 숲_조판TER가 설정되지 않았습니다.
/usr/share/man/man1/tfmtodit.1.gz
       수학을 잘 배우기 위해서는조판ting, groff에는 글꼴 메트릭이 필요합니다.
/usr/share/man/man1/ptx.1.gz
       -티,--조판-구현되지 않은 모드-
/usr/share/man/man1/chrt.1.gz
/usr/share/man/man1/tasksset.1.gz
/usr/share/man/man1/chem.1.gz
              ~을 위한조판화학 구조 다이어그램 [CSTR #122].
       cm.bell-labs.com/netlib/조판ting/chem.gz . README 파일이 사용됩니다.
       조판화학구조도 [CSTR #122] ⟨http://
/usr/share/man/man1/chacl.1.gz

처음 5개 결과에는 실제로 "typeset"이 전혀 포함되어 있지 않습니다. 다른 검색어도 비슷하게 동작합니다.

저는 Ubuntu 20.04.4 LTS(5.15.0-43-generic)와 man 2.9.1을 실행하고 있습니다. 이는 macOS 12.5 및 man 1.6g에서도 문제가 되는 것 같은데, 제가 뭔가 잘못하고 있는 것인지 궁금합니다.

답변1

man -K매뉴얼 페이지 소스 파일의 주석을 포함하여 모든 것을 검색합니다.

이 문자열은 typeset많은 GNU 및 기타 GNU-GPL 라이센스 프로그램에서 GNU GPL 라이센스 헤더의 일부로 나타납니다.

.\" 이 문서는 무료 문서이므로 재배포 및/또는
.\"로 수정된 GNU General Public License의 조건에 따라
.\" 자유 소프트웨어 재단에서 게시, 버전 2
.\" 라이센스 또는 (귀하의 선택에 따라) 이후 버전.
.\”
.\" "개체 코드"에 대한 GNU 일반 공중 사용 허가서 참조
.\" 및 "executable"은 다음과 같이 해석됩니다.
.\" 문서 형식 또는조판시스템을 포함
.\" 사이에 넣고 인쇄합니다.

제가 제공할 수 있는 편리한 솔루션이 없습니다. 그러나 매뉴얼 페이지에는 설명이 많지 않은 경향이 있으므로 질문은 몇 문장으로 제한됩니다.

답변2

우분투시스템, 무엇이 문제인가?같은 페이지에 Giles의 답변 세부 사항. 나는 그가 이 분야에 대한 전문 지식을 제공했기 때문에 그의 대답을 받아들입니다. 고마워요, 자일스!

애플 시스템시스템이다.반품확인된 대로 파이프된 매뉴얼 페이지에는 여전히 문서의 검색어에 제어 문자가 포함되어 있기 때문입니다 man man | sed -n l.

한 가지 해결 방법은 먼저 필터링 문자를 사용하여 col -b서식을 제거하는 것입니다.

search=typeset
man -awK -- "$search" | xargs -I {} sh -c "echo '{}'
    man --no-hyphenation --no-justification -- {} | \
    col -b | grep -iF --color=always -- '$search'"

또 다른 해결책은 형식을 유지하는 를 사용 MAN_KEEP_FORMATTING=1하고 파이프하는 것 입니다.ul

search=typeset
man -awK -- "$search" | xargs -I {} sh -c "echo '{}'
    MAN_KEEP_FORMATTING=1 man --no-hyphenation --no-justification -- {} | \
    ul | grep -iF --color=always -- '$search'"

(솔루션에 대한 자세한 내용 ul: MAN_KEEP_FORMATTING=1표시된 대로 지정하는 것은 man manUbuntu 20.04.4에서는 필요하지 않은 것 같지만하다macOS에는 필요한 것으로 보이며 다른 운영 체제에도 필요할 수 있으므로 확실하게 포함하기만 하면 됩니다. 다음과 같이 자세히 설명된 또 다른 솔루션스티븐 차제라스내 관련 질문에 있지만 솔루션은 macOS가 아닌 Ubuntu에서만 작동합니다. )

두 경우 모두 신뢰할 수 있는 유일한 솔루션 은 grep을 사용하여 두 번째 필터링 단계를 수행하는 것입니다.

* 검색어에 여러 줄에 걸쳐 있는 여러 단어가 포함되어 있지 않다고 가정합니다(대부분 한 줄 끝에 한 단어만 있고 다음 줄 시작 부분에 다음 단어가 있을 가능성이 높습니다). 그렇다면 필터를 pcre2grep -M 'search\s+term대신 사용해 보세요.

search=typeset
man -awK -- "$search" | \
    xargs -I {} sh -c "man --no-hyphenation --no-justification -- {} | \
    col -b | grep -qiF -- '$search' && printf '%s\n' '{}'"

매뉴얼 페이지를 검색하고 매뉴얼 페이지 형식(색상 등)을 유지하면서 결과를 강조 표시하는 보다 자세한 코드 솔루션을 원하는 경우,내 관련 질문을 참조하십시오.

관련 정보