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


11

예제 명령으로

man apropos > outputfile

형식화 된 man페이지 를 포함하는 텍스트 파일이 생성 됩니다 (굵은 문자와 같이 화면 apropos에 man 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.