맨페이지가 있고 특정 섹션에서 무언가를 찾고 싶습니다. Grep에 문제가 있어서 헤더에 제어 문자가 포함되어 있다는 것이 문제라는 것을 알았습니다.
SEE ALSO
그건 진실이야:
S^HSE^HEE^HE A^HAL^HLS^HSO^HO$
(고마워요, cat -e
오늘도 뭔가 배웠어요)
문자 클래스 및 기타 기술을 사용하여 grep 및 sed의 다양한 변형을 가지고 놀았지만 알아낼 수 없었습니다.
"섹션의 모든 항목도 참조하세요"와 같이 가장 잘 돌아가는 방법에 대한 제안이 있으신가요? 이는 다른 사람들에게 유용할 만큼 일반적이어야 하지만 자세한 답변을 제공할 수 있을 만큼 구체적이어야 합니다. :)
man
이 경우 출력은 aws help
less로 파이프되는 다른 명령에 의해 생성되므로 실제로 도움이 필요하지 않습니다 .
답변1
일반 버전의 매뉴얼 페이지를 얻는 방법에 대한 아이디어는 다음에서 찾을 수 있습니다 man man
.
man foo | col -b
이를 기반으로 다음과 같은 부분 하나만 얻을 수 있습니다 pcregrep
.
man man | col -b | pcregrep -Mo '^SEE ALSO(.|\n)*?^[^ ]'
이를 약간 조정하고 함수에 적용하여 모든 부분의 모든 부분을 g
쉽게 나타낼 수 있습니다 .s
man
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"