พิมพ์หน้าคนที่มีความกว้างคงที่


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 (ไม่เกี่ยวข้องกับคำถามอย่างเคร่งครัด):

หากต้องการทำการตั้งค่าความกว้างถาวรที่จะนำไปใช้กับการพิมพ์ manpage ใด ๆ คุณจำเป็นต้องส่งออกค่าตัวแปรที่ต้องการ ด้วย:

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

man aproposจะถูกพิมพ์ด้วยความกว้างเดียวกันโดยไม่คำนึงถึงการปรับขนาดหน้าต่างเทอร์มินัล แทน,

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

จะให้ผลเช่นเดียวกับก่อนเท่านั้นถ้าหน้าต่าง terminal ไม่ได้ปรับขนาดระหว่างและexportman <page> > outputfile


ฉันไม่สามารถทำซ้ำinput codeข้อผิดพลาดของคุณ195 168 อาจเป็นèใน UTF-8 หน้าคนเป็นภาษาอังกฤษหรือไม่? ผู้ชายของคุณใช้งานอะไร สถานที่ของคุณคืออะไร?
Stéphane Chazelas

ระบบคือ Ubuntu 14.04 (รุ่นจากman man2.6.7.1) man page เป็นภาษาอิตาลีและเป็น 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
ใช่เทอร์มินัลที่ไม่ทำงานนั้นมาจากlessเพราะTERMไม่ได้ตั้งค่า ฉันหมายถึงenv -i LANG=it_IT.UTF-8 man apropos > output(หรือ| head)
Stéphane Chazelas

คำตอบ:


19

ใช้MANWIDTHตัวแปรสภาพแวดล้อม:

MANWIDTH=60 man apropos > apropos.txt

manpage สำหรับ 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 ขึ้นอยู่กับความกว้าง terminal ของคุณตามที่แนะนำที่นี่ในวิกิพีเดีย Arch
sampablokuper

@Marcel M ขอบคุณสำหรับคำตอบที่แม่นยำมากของคุณ คุณช่วยกรุณาอ่านการปรับปรุงในคำถามและแก้ไขคำตอบของคุณเพื่อรวมข้อเสนอแนะพื้นฐานเกี่ยวกับexport MANWIDTH=60?
BowPark

@ BowPark ฉันเขียนคำตอบโดยไม่ต้องexportเพราะคุณถามเกี่ยวกับการแก้ปัญหาชั่วคราว: "วิธีการแก้ไขความกว้างของบรรทัดสูงสุดในระหว่างการสร้าง outputfile หรือไม่ " (ฉันเน้น) คุณอาจต้องการย้อนกลับการแก้ไขของคุณเนื่องจากมันไม่ได้เพิ่มในคำถาม (ความคิดเห็นเหมาะสมกว่า)
Marcel M

@MarcelM ที่จริงแล้วคุณพูดถูก ฉันแก้ไขคำถามตามนั้น ฉันเขียนการแก้ไขครั้งที่สองโดยใช้exportคำสั่งเพราะในความคิดเห็นมันเกือบจะอ่านไม่ได้ (เป็นไปไม่ได้ที่จะสร้างบรรทัดใหม่)
BowPark

10

ลองตั้งค่าCOLUMNSตัวแปรสภาพแวดล้อม ได้ผลสำหรับฉันด้วยmanจากmandb2.7.0.2 บน Debian ด้วยgroff1.22.3

$ 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ตัวแปรสภาพแวดล้อมถ้า stdin เป็นขั้ว (มันแล้วสอบถามอุปกรณ์ปลายทางสำหรับความกว้าง Terminal)

คุณสามารถลอง:

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และไม่ได้ใช้ในการดำเนินการก่อนไฟล์กับ-kpreconv


ฉันลองคำสั่งเดียวกัน: COLUMNS=60 man apropos | headแต่น่าเสียดายที่ความกว้างของเอาต์พุตคือความกว้างของหน้าจอทั้งหมด ฉันสามารถตั้งค่าตัวแปรCOLUMNSที่อื่นหรือในทางอื่นได้หรือไม่?
BowPark

2
ลองCOLUMNS=60 < /dev/null man apropos | headดู ดูเหมือนว่าใน Ubuntu 14.04 มันไม่น่าเชื่อถือCOLUMNSถ้า stdin เป็นเทอร์มินัล (และรับความกว้างจากอุปกรณ์ปลายทาง)
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 ตัวอักษร"

ดูแลสิ่งนี้คุณอาจใช้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.