제어 문자가 포함된 맨페이지에서 제목을 찾는 방법

제어 문자가 포함된 맨페이지에서 제목을 찾는 방법

맨페이지가 있고 특정 섹션에서 무언가를 찾고 싶습니다. Grep에 문제가 있어서 헤더에 제어 문자가 포함되어 있다는 것이 문제라는 것을 알았습니다.

SEE ALSO

그건 진실이야:

S^HSE^HEE^HE A^HAL^HLS^HSO^HO$

(고마워요, cat -e오늘도 뭔가 배웠어요)

문자 클래스 및 기타 기술을 사용하여 grep 및 sed의 다양한 변형을 가지고 놀았지만 알아낼 수 없었습니다.

"섹션의 모든 항목도 참조하세요"와 같이 가장 잘 돌아가는 방법에 대한 제안이 있으신가요? 이는 다른 사람들에게 유용할 만큼 일반적이어야 하지만 자세한 답변을 제공할 수 있을 만큼 구체적이어야 합니다. :)

man이 경우 출력은 aws helpless로 파이프되는 다른 명령에 의해 생성되므로 실제로 도움이 필요하지 않습니다 .

답변1

일반 버전의 매뉴얼 페이지를 얻는 방법에 대한 아이디어는 다음에서 찾을 수 있습니다 man man.

man foo | col -b

이를 기반으로 다음과 같은 부분 하나만 얻을 수 있습니다 pcregrep.

man man | col -b | pcregrep -Mo '^SEE ALSO(.|\n)*?^[^ ]'

이를 약간 조정하고 함수에 적용하여 모든 부분의 모든 부분을 g쉽게 나타낼 수 있습니다 .sman

gsman () { man $1 | col -b | pcregrep -iMo "^$2(.|\n)*?(?=\n[A-Z])" ; }

그리고 사용법은

gsman grep options | grep invert

답변2

여기서는 16진수 덤퍼( hexdump, xxd) 가 유용할 수 있습니다.ascii(7)

man ls | hexdump -C
...

이는 다음을 나타냅니다.

000045f0  35 29 2e 0a 0a 53 08 53  45 08 45 45 08 45 20 41  |5)...S.SE.EE.E A|
00004600  08 41 4c 08 4c 53 08 53  4f 08 4f 0a 20 20 20 20  |.AL.LS.SO.O.    |

이는 16진수 코드 8 또는 묶음 bs( ^H디스플레이 의 cat의미)입니다. 껍질을 벗기는 방법에는 bs여러 가지 방법이 있습니다.

% man ls | perl -ple 'tr/\x08//d' | grep SEE
SSEEEE AALLSSOO

글쎄, 그것은 좋지 않습니다. 또한 뒤로 공백 문자를 제거해야 합니다.

% man ls | perl -ple 's/.\x08//g' | perl -00 -nle 'print if m/SEE ALSO/'
SEE ALSO
     chflags(1), chmod(1), sort(1), xterm(1), compat(5), termcap(5),
     symlink(7), sticky(8)

답변3

section="SEE ALSO"
regex=$(sed 's/./&.*/g' <<<"$section")       # S.*E.*E.* .*A.*L.*S.*O.*
# then
some help command | sed -n '/^'"$regex"'/,/^[^[:blank:]]/ p' | sed '$d'
  • 정규 표현식은 주어진 섹션 이름의 각 문자 사이에 임의의 문자 수를 허용합니다.
  • 첫 번째 sed 명령은 정규 표현식의 주어진 부분과 다음 부분 사이의 행만 출력합니다(해당 부분의 모든 행에는 선행 공백이 있다고 가정합니다).
  • 두 번째 sed 명령은 후행 섹션 헤더를 제거합니다.

Bash 함수로:

man_section() {
    local section=$1
    local regex=$(sed 's/./&.*/g' <<<"$section")
    sed -n '/^'"$regex"'/,/^[^[:blank:]]/ p' | sed '$d'
}

some help command | man_section "SEE ALSO"

관련 정보