너비가 고정 된 매뉴얼 페이지 인쇄


11

예제 명령으로

man apropos > outputfile

형식화 된 man페이지 를 포함하는 텍스트 파일이 생성 됩니다 (굵은 문자와 같이 화면 aproposman apropos직접 인쇄되는 것과 약간의 차이가 있음 ).

그러나 생성 된 출력 파일의 최대 행 너비를 수동으로 설정하여 모든 단락이 해당 너비에 맞게 조정되도록하고 싶습니다.

man을 통해 페이지가 생성됩니다 groff예를 들어, 내가 넣어 시도 : .ll 50원래의 단락 전에 .gz man소스 텍스트 파일,하지만 몇 가지에 대한 작업을해야하는 경우가 사소한 man페이지. 또한 모든 문자가 인식되는 것은 아닙니다.

apropos.1:45: warning: can't find character with input code 195
apropos.1:45: warning: can't find character with input code 168
apropos.1:47: warning: can't find character with input code 178
apropos.1:131: warning: can't find character with input code 169

더 간단한 방법이 있는지 궁금합니다. ?를 만드는 동안 최대 선 너비를 수정하는 방법은 outputfile무엇입니까? 특정 명령이 있습니까?


편집 :

(다음 모든 고려 사항은 Ubuntu 18.04에 관한 것입니다. 위의 14.04 질문을 포함하여 이전 버전에서는 더 이상 테스트 할 수 없습니다.)

한 줄 임시 솔루션과 관련하여 MANWIDTH아직 사용자 정의 값으로 내 보내지 않은 경우 에는 차이가 없습니다.

$ MANWIDTH=60 man apropos > outputfile

$ COLUMNS=60 man apropos > outputfile

그러나 첫 번째 방법 MANWIDTH은 원칙적으로 더 좋습니다.


편집 2 (질문과 밀접한 관련이 없음) :

대신 모든 맨 인쇄에 적용되는 영구 폭 설정을하고, 그 필요가 내보내 변수의 원하는 값. 와:

$ export MANWIDTH=60
# zero or more additional lines
$ man apropos > outputfile

man apropos터미널 창의 크기 조정에 관계없이 동일한 너비로 인쇄됩니다. 대신에

$ export COLUMNS=60
# zero or more additional lines
$ man apropos > outputfile

export와 사이의 터미널 창이 크기를 조정하지 않은 경우에만 이전과 동일한 결과를 제공합니다 man <page> > outputfile.


UTF-8로 input code오류를 재현 할 수 없습니다 195 168. 맨 페이지가 영어입니까? 당신의 남자 구현은 무엇입니까? 로케일이 무엇입니까?
Stéphane Chazelas

시스템은 Ubuntu 14.04입니다 (버전 man man2.6.7.1). 매뉴얼 페이지는 이탈리아어로되어 있으며 UTF-8입니다. 로케일은 무슨 뜻입니까?
BowPark

출력은 locale무엇입니까? 그리고 locale charmap?
Stéphane Chazelas

locale출력 : LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmap출력 :UTF-8
BowPark

1
예, 설정되지 않았기 때문에 기능하지 않는 터미널 이 시작되었습니다 . 나는 (또는 )을 의미했다 . lessTERMenv -i LANG=it_IT.UTF-8 man apropos > output| head
Stéphane Chazelas

답변:


19

MANWIDTH환경 변수를 사용하십시오 .

MANWIDTH=60 man apropos > apropos.txt

man 2.7.4의 맨 페이지는 다음과 같이 말합니다.

$ MANWIDTH가 설정되면 해당 값은 매뉴얼 페이지의 형식을 지정할 행 길이로 사용됩니다. 설정되지 않은 경우 매뉴얼 페이지는 현재 터미널에 적합한 행 길이로 형식화됩니다 ($ COLUMNS 값, 사용 가능한 경우 ioctl (2) 또는 사용 가능한 경우 80 자).

COLUMNS, ioctl값 과 값을 모두 대체 합니다. COLUMNS창 크기가 변경 될 때마다 값이 동적으로 업데이트되므로 수정에 의존 하지 않는 것이 좋습니다 (여기에서는 작동하지만).

사용 MANWIDTH대신에 COLUMNS도하면 같은 줄을 추가하여 변경 사항을 영구적으로 할 수 있습니다 export MANWIDTH=60쉘 시작 파일에.


훌륭한 직업. 나는 COLUMNS도 바꾸고 싶지 않았고, MANWIDTH는 RHEL5에서 치료를합니다. 건배.
Felipe Alvarez

1
독자를위한 참고 사항 : export MANWIDTH=60에서 설정 하는 경우 사용해야 할 수 있습니다 ~/.bashrc. stackoverflow.com/a/30173376/82216을 참조하십시오 . 또한 아치 위키에서 man제안한 것처럼 터미널 너비에 따라 MANWIDTH를 설정하는 함수를 래핑 하는 것을 고려 하십시오 .
sampablokuper

@Marcel M 정확한 답변을 주셔서 감사합니다. 질문의 업데이트를 읽고에 대한 기본 제안을 포함하도록 답변을 편집 할 수 export MANWIDTH=60있습니까?
BowPark

@BowPark export"당신 은 출력 파일을 만드는 동안 최대 라인 너비를 수정하는 방법은 ? " 질문에 추가되지 않은 편집 내용을 되돌릴 수도 있습니다. (의견이 더 적절하다.)
Marcel M

@MarcelM 사실 당신이 맞아요. 그에 따라 질문을 편집했습니다. export주석에서 주석을 거의 읽을 수 없으므로 줄 바꿈을 만들 수 없으므로 두 번째 편집 내용을 작성했습니다.
BowPark

10

COLUMNS환경 변수를 설정하십시오 . 1.22.3의 데비안 man에서 mandb2.7.0.2 부터 작동합니다 groff.

$ COLUMNS=60 man apropos | head
APROPOS(1)          Manual pager utils          APROPOS(1)



NAME
       apropos - search the manual page names and descrip
       tions

SYNOPSIS
       apropos [-dalv?V] [-e|-w|-r]  [-s  list]  [-m  sys

$ COLUMNS=70 man apropos | head
APROPOS(1)               Manual pager utils               APROPOS(1)



NAME
       apropos - search the manual page names and descriptions

SYNOPSIS
       apropos  [-dalv?V] [-e|-w|-r] [-s list] [-m system[,...]] [-M
       path] [-L locale] [-C file] keyword ...

Ubuntu 14.04 버전에서는 다음과 같이 작성해야합니다.

COLUMNS=60 < /dev/null man apropos | head

거기 man무시 같다 COLUMNS표준 입력 터미널 (이것은 상기 터미널 폭 단말 장치를 쿼리)이면 환경 변수.

시도해 볼 수도 있습니다 :

s=$(stty -g); stty cols 60; man apropos | head; stty "$s"

zsh당신 과 함께 단축 할 수있는 것 :

STTY='cols 60' man apropos | head

다음 groff과 같이 손으로 호출 하여 수행 할 수 있습니다.

gzip -dcf "$(man -w apropos)" |
  groff -ekpstR -mtty-char -mandoc -Tutf8 -rLL=60n |
  col -bpx

귀하의 입력 코드로 찾을 수없는 문자 는 사용했기 때문에 오류가 있었다 -Tascii대신 -Tutf8하고 사용하지 않은 -k으로 파일을 사전 처리하는 preconv.


나는 같은 명령을 시도 COLUMNS=60 man apropos | head했지만 불행히도 출력 너비는 모든 화면 너비입니다. COLUMNS다른 곳이나 다른 방법으로 변수를 설정할 수 있습니까 ?
BowPark

2
시도하십시오 COLUMNS=60 < /dev/null man apropos | head. 우분투 14.04에서와 같이 COLUMNSstdin이 터미널인지 터미널 터미널에서 너비를 얻는 지 신뢰할 수 없습니다 .
Stéphane Chazelas

아마 당신이 생각한 것 같습니다. 그리고 지금 작동합니다, 감사합니다!
BowPark

4

fmt내가 아는 한 모든 Linux 배포판에 있는 명령을 사용할 수 있습니다 .

man apropos | fmt -w 70 

70 자로 줄을 바꿉니다.


1
그렇습니다. 감사합니다. 작동하고 꽤 유용하지만 정당화 된 텍스트 가 필요하고 대신 줄을 마무리합니다.
BowPark

죄송합니다. 그 부분을 놓쳤을 것입니다.
dr_

2

당신이 사용할 수있는 fold

man cp | fold -w 20

각 20 자 (!) 뒤에 접 힙니다. 유일한 옵션은 "20 문자마다 접기"이므로 단어를 2 개로 자릅니다.

이것을 sed돌보면 다음과 같이 사용할 수 있습니다 (동적 선 길이)

man cp | sed 's/.\{20\} /&\n/g'

20 개의 임의의 문자 다음에 공백 (예 : 새 단어) 뒤에 줄 바꿈을 추가합니다. 따라서 줄은 20자를 초과 할 수 있습니다 (일치 문자는 20 자이므로 공백은 26 자이므로 26 자입니다)

sed명령 에서 마지막 공백을 생략하려면 다음을 수행하십시오.

sed 's/\(.\{20\}\) /\1\n/g'

1
고맙습니다, 나는 당신의 예를 시험해 보았지만 효과가 있었지만 dr01에 대한 의견에 쓰여진 것처럼 정당한 텍스트가 필요합니다.
BowPark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.