grep 명령을 통해 매뉴얼 페이지를 필터링할 수 없는 이유는 무엇입니까? [복사]

grep 명령을 통해 매뉴얼 페이지를 필터링할 수 없는 이유는 무엇입니까? [복사]

내 시스템에 뭔가가 변경되었는지는 확실하지 않지만 grep내 명령을 통해 Unix 매뉴얼 페이지를 필터링하는 것이 작동하지 않는다는 것을 발견했습니다. 무엇이 문제인지 아시나요?

예를 들어jq 매뉴얼 페이지다음 코드에서 컴파일되었습니다.

.
.IP "\(bu" 4
\fB\-\-slurp\fR/\fB\-s\fR:
.
.IP
Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once\.
.

스위치를 빨리 찾으려면 --slurp일반적으로 다음 터미널 세션에 표시된 대로 jq매뉴얼 페이지를 필터링합니다.grep

$ man jq | grep -- --slurp
$

아무것도 반환되지 않는 방법에 주목하세요. 이상합니다. 예상되는 결과는 아래와 같습니다.

$ man jq | grep -- --slurp
       •   --slurp/-s:

이는 실제로 man jq명령을 실행하고 /검색 키 입력을 사용한 다음 검색을 사용하면 --slurp작동하기 때문에 예상되는 현상입니다.

# ...
       •   --slurp/-s:

           Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once.

특수문자에 문제가 있는 것 같은데 잘 모르겠습니다. 명령을 통해 매뉴얼 페이지를 넣으려고 했지만 cat그것도 작동하지 않았습니다. 또한 모든 특수 문자를 제거해 보았습니다.Linux 텍스트에서 모든 특수 문자를 제거하는 방법--하지만 그것도 안 돼요.

$ man jq | cat | grep -- --slurp
$
$ man jq | sed $'s/[^[:print:]\t]//g' | grep -- --slurp
$

관련이 있는 경우 내 시스템에 대한 세부정보는 다음과 같습니다.

$ neofetch --off
OS: macOS 13.0.1 22A400 x86_64
Host: MacBookPro16,1
Kernel: 22.1.0
Uptime: 6 days, 1 hour, 3 mins
Packages: 145 (brew)
Shell: bash 3.2.57
Resolution: 1792x1120@2x
DE: Aqua
WM: Quartz Compositor
WM Theme: Blue (Light)
Terminal: iTerm2
Terminal Font: Monaco 12
CPU: Intel i7-9750H (12) @ 2.60GHz
GPU: Intel UHD Graphics 630, AMD Radeon Pro 5300M
Memory: 10425MiB / 16384MiB

답변1

내 Mac 노트북에서 당신과 같은 것을 보았습니다. 저는 설정 이나 환경 변수 man -P cat대신 호출기를 cat으로 설정하곤 했습니다. 매뉴얼 페이지를 탐색했을 때 마지막에 다음을 발견했습니다.PAGERMANPAGERman

To get a plain text version of a man page, without backspaces and underscores, try

         # man foo | col -b > foo.mantxt

그래서 나는 그것을 시도했고 인수 줄을 포함하여 man jq | col -b | grep slurp그 안에 줄을 얻었습니다 .slurp--slurp

내 생각에 가장 좋은 단서는 '라는 문구에 대한 매뉴얼 페이지입니다.백스페이스 키나 밑줄 없음'. 물론, 각 문자 사이에 두 문자를 허용하면 slurp예상한 줄이 표시됩니다.

man -P cat jq | grep s..l..u..r..p

od -a검사 라인 중 하나를 사용하면 --slurp다음과 같은 결과를 얻을 수 있습니다.

0000420   sp   U   s   e  sp   -  bs   -   -  bs   -   s  bs   s   l  bs
0000440    l   u  bs   u   r  bs   r   p  bs   p   f  bs   f   i  bs   i
0000460    l  bs   l   e  bs   e  sp   i   n   s   t   e   a   d   .  nl

Use --slurpfile instead.이것은 렌더러가 분명히 백스페이스 키를 사용하고 문자열의 굵은 인쇄를 나타내기 위해 문자를 다시 인쇄한다는 것을 보여주는 줄의 일부입니다 --slurpfile. 백스페이스 키와 추가 문자는 간단한 grep 명령을 무효화합니다. (저도요)

따라서 col -b이전에 매뉴얼 페이지를 파이핑하면 grep원하는 방식으로 출력을 검색할 수 있는 것처럼 보입니다.

관련 정보