निश्चित चौड़ाई वाले मैन पेज प्रिंट करें


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? क्या कोई विशिष्ट आदेश है?


संपादित करें :

(सभी निम्नलिखित विचार उबंटू 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


मैं यूटीएफ -8 में आपकी input codeत्रुटियों 195 168को पुन: पेश नहीं कर सकता। क्या मैन पेज अंग्रेजी में है? आपका आदमी कार्यान्वयन क्या है? आपका लोकेल क्या है?
स्टीफन चेजलस

सिस्टम Ubuntu 14.04 (संस्करण man man2.6.7.1 से है)। मैन पेज इटैलियन में है और यह UTF-8 है। लोकेल से आपका क्या मतलब है?
बोवपार्क

का आउटपुट क्या है locale? और locale charmap?
स्टीफन चेजलस 16

localeआउटपुट: LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmapआउटपुट:UTF-8
१ark

1
हां टर्मिनल कार्यात्मक नहीं है lessक्योंकि TERMसेट नहीं है। मेरा मतलब था env -i LANG=it_IT.UTF-8 man apropos > output(या | head)।
स्टीफन चेज़लस

जवाबों:


19

MANWIDTHपर्यावरण चर का उपयोग करें :

MANWIDTH=60 man apropos > apropos.txt

2.7.4 आदमी के लिए मेनपेज कहता है:

यदि $ MANWIDTH को सेट किया जाता है, तो इसका मान लाइन की लंबाई के रूप में उपयोग किया जाता है जिसके लिए मैनुअल पृष्ठों को प्रारूपित किया जाना चाहिए। यदि यह सेट नहीं किया गया है, तो मैन्युअल पृष्ठों को वर्तमान टर्मिनल के लिए उपयुक्त एक लाइन की लंबाई के साथ स्वरूपित किया जाएगा (यदि उपलब्ध हो, तो $ COLUMNS के मूल्य का उपयोग, एक ioctl (2) या उपलब्ध होने पर वापस 80 वर्णों तक गिरने पर)।

यही है, यह दोनों COLUMNSऔर ioctlमूल्य से आगे निकल जाता है। COLUMNSजब भी हर बार विंडो का आकार बदलता है, तब तक इसके मूल्य को गतिशील रूप से अपडेट किए जाने के बाद मैं इसमें संशोधन (हालांकि यह यहां काम करता है) पर भरोसा नहीं करना पसंद करता हूं ।

MANWIDTHइसके बजाय का उपयोग करने से COLUMNSआप export MANWIDTH=60अपनी शेल स्टार्टअप फ़ाइल जैसी एक पंक्ति जोड़कर परिवर्तन को स्थायी बना सकते हैं ।


बहुत ही उत्तम कार्य। मैं या तो COLUMNS को बदलना नहीं चाहता था, और MANWIDTH RHEL5 में एक इलाज का काम करता है। चीयर्स।
फेलिप अल्वारेज़

1
पाठकों को एक नोट: यदि आप इसे export MANWIDTH=60अपने में सेट करते हैं तो आपको इसका उपयोग करने की आवश्यकता हो सकती है ~/.bashrcStackoverflow.com/a/30173376/82216 देखें । इसके अलावा, manअपने टर्मिनल चौड़ाई के आधार पर MANWIDTH सेट करने के लिए एक फ़ंक्शन में रैपिंग पर विचार करें, जैसा कि आर्क विकी पर यहां दिया गया है।
सम्पाबल्कुपर

@ मार्सेल एम आपके बहुत सटीक उत्तर के लिए धन्यवाद। क्या आप कृपया प्रश्न में अपडेट पढ़ सकते हैं और मौलिक सुझाव को शामिल करने के लिए अपने उत्तर को संपादित कर सकते हैं export MANWIDTH=60?
बोवपार्क

@BowPark के बिना मैंने जवाब लिखा exportक्योंकि आपने एक अस्थायी समाधान के बारे में पूछा था: " आउटपुटफाइल के निर्माण के दौरान अधिकतम लाइन की चौड़ाई को कैसे संशोधित किया जाए ? " (मेरा जोर)। आप अपने संपादन को वापस करना भी चाह सकते हैं क्योंकि यह प्रश्न में नहीं जोड़ता है। (एक टिप्पणी अधिक उपयुक्त है।)
मार्सेल एम

@ मार्सेलएम वास्तव में आप सही हैं। मैंने तदनुसार प्रश्न संपादित किया। मैंने exportबयानों के साथ एक दूसरा संपादन लिखा क्योंकि एक टिप्पणी में यह लगभग अपठनीय होगा (नए अंक बनाने के लिए संभव नहीं है)।
बोवपार्क

10

COLUMNSपर्यावरण चर सेट करने का प्रयास करें । डेबियन पर 1.22.3 के साथ 2.7.0.2 manसे मेरे लिए काम करता है ।mandbgroff

$ 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कहीं और या अन्य तरीके से सेट कर सकता हूं ?
बोवपार्क

2
कोशिश करो COLUMNS=60 < /dev/null man apropos | head। 14.04 उबंटू की तरह दिखता है, यह भरोसा नहीं करता है COLUMNSकि स्टडिन एक टर्मिनल है (और टर्मिनल डिवाइस से चौड़ाई मिलती है)।
स्टीफन चेज़लस 16

हो सकता है कि यह आपके जैसा ही हो। और अब यह काम करता है, धन्यवाद!
बाउपार्क

4

आप fmtकमांड का उपयोग कर सकते हैं , जहां तक ​​मुझे पता है कि किसी भी लिनक्स वितरण में मौजूद है।

man apropos | fmt -w 70 

70 वर्णों पर रेखाएँ लपेटेंगी।


1
हाँ, मेरे पास है, धन्यवाद, यह काम करता है और यह बहुत उपयोगी है, लेकिन मुझे एक उचित पाठ की आवश्यकता है और यह केवल इसके बजाय लाइनों को लपेटता है।
बोवपार्क

क्षमा करें, मुझे वह हिस्सा याद आ गया होगा।
dr_

2

आप उपयोग कर सकते हैं fold

man cp | fold -w 20

प्रत्येक 20 अक्षरों (!) के बाद गुना जाएगा। ध्यान दें कि यह दो शब्दों में कटौती करेगा क्योंकि एकमात्र विकल्प "प्रत्येक 20 वर्णों को मोड़ो" है

इस बात का ध्यान रखते हुए, आप sedनिम्नानुसार उपयोग कर सकते हैं (डायनेमिक लाइन लंबाई के साथ)

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

एक स्थान (यानी नया शब्द) के बाद 20 यादृच्छिक वर्णों के बाद एक नई पंक्ति जोड़ देगा। तो लाइनें 20 वर्णों से अधिक लंबी हो सकती हैं (मैच 20 वर्ण का है तो एक स्थान तो 26 वर्ण वाले शब्द का परिणाम 26 वर्णों में होगा)

sedकमांड में अंतिम स्थान को छोड़ने के लिए :

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

1
धन्यवाद, मैंने आपके उदाहरणों की कोशिश की और वे काम करते हैं, लेकिन जैसा कि dr01 के लिए एक टिप्पणी में लिखा गया है - मुझे एक उचित पाठ की आवश्यकता है।
बोवपार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.