มีเครื่องมือบรรทัดคำสั่งเพื่อแทรกตัวแบ่งบรรทัดลงในสตริงที่ยาวหรือไม่


18

ด้วยสตริงที่มีความยาวที่ต้องแสดงด้วยความกว้างของข้อความที่ จำกัด มีเครื่องมือบรรทัดคำสั่งใน * nix ที่แปลงสตริงบรรทัดเดียวเป็นสตริงหลายบรรทัดโดยแต่ละบรรทัดไม่เกินความกว้างของข้อความที่กำหนดหรือไม่

ตัวอย่างเช่นกำหนดสตริงต่อไปนี้

$ MYSTRING="Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."

ฉันต้องการจัดรูปแบบดังนี้:

$ echo $MYSTRING | special-format-command --width=30
Call me Ishmael. Some years ag
o - never mind how long precis
ely - having little or no mone
y in my purse, and nothing par
ticular to interest me on shor
e, I thought I would sail abou
t a little and see the watery 
part of the world.

คำตอบ:


24

คุณอาจลองใช้foldคำสั่ง:

echo "$MYSTRING" | fold -w 30

2
+1 แต่อาจเขียนได้ดีกว่าecho $MYSTRING | fold -w 30เนื่องจาก-30ไวยากรณ์ไม่ปรากฏในmanpage การพับหรือไม่
ire_and_curses

5
fmtสำหรับลูกหลานนอกจากนี้ยังมี ความแตกต่างระหว่างfoldและfmtคือที่foldจะตัดที่ความกว้างคงที่แม้แยกคำและอาจเริ่มต้นบรรทัดด้วยช่องว่าง ในขณะที่fmtจะห่อใกล้หรือภายใต้ความกว้างมันจะไม่แยกคำบรรทัดจะไม่เริ่มต้นด้วยช่องว่างและบรรทัดสั้น ๆ อาจเข้าร่วม
bahamat

5
foldดูเหมือนจะมีพฤติกรรมที่คล้ายกันfmtเมื่อใช้-sตัวเลือก
Cory Klein

ตลกฉันใช้ตัวเลือก -w แต่มันแยกโดยถ่าน
สัตว์สะเทินน้ำสะเทินบก

6

นี่คือวิธีการที่ใช้sed:

sed 's/.\{30\}/&\
/g'

แต่มันหมายความว่าอะไร?
Richard

1
@Richard แทนที่ 30 ของอักขระใด ๆ ยกเว้น newline ( .\{30\}) ด้วยสตริงเดียวกัน ( &) ตามด้วย newline
Chris Down

6

วัตถุประสงค์ทั้งหมดของfmt(ส่วนหนึ่งของ coreutils ของ GNU และรุ่นอื่น ๆ ของ IIRC รวมอยู่กับ non-GNU * nixes ดังนั้นจึงมั่นใจได้ว่าจะติดตั้งแล้ว) คือการฟอร์แมตย่อหน้าใหม่

อย่างไรก็ตามมีเครื่องมือที่ดียิ่งขึ้นเรียกว่าpar(สำหรับการปฏิรูปย่อหน้า) มันสามารถทำทุกอย่างที่fmtทำได้ แต่มีตัวเลือกมากมายให้คุณควบคุมรูปแบบเอาต์พุตที่แน่นอน

หนึ่งในหลาย ๆ สิ่งที่ดีจริงๆเกี่ยวกับparคือมันฉลาดมากเกี่ยวกับการจัดการข้อความในอีเมล (แม้กระทั่งหลายระดับของการอ้างอิง) - มีประโยชน์มาก ... ฉันมี. vimrc ของฉันตั้งค่าเพื่อให้กดปุ่ม F5 ส่งย่อหน้าปัจจุบันผ่านตราไว้

หากยังไม่ได้บรรจุสำหรับ distro ของคุณ (สำหรับเดเบียนและตราสารอนุพันธ์หรืออื่น ๆ ด้วย) อาจพบได้ที่http://www.nicemice.net/par/


โดย "non-GNU * nixes" คุณหมายถึง "real" (ไม่ใช่ "Unix-like") Unixes หรือไม่ (มิฉะนั้นเครื่องมือที่เจ๋ง ๆ ก็ดูเหมือน)
Emanuel Berg

ฉันหมายถึงขยะที่เป็นกรรมสิทธิ์ของล้าสมัยในปัจจุบัน
cas

นั่นคือสิ่งที่ฉันคิด แต่ทำไมคุณถึงใช้เครื่องหมายดอกจัน ฉันคิดว่าจะต้องหลีกเลี่ยงการพิมพ์ "เหมือน Unix" ตลอดเวลา (สำหรับ Linux ฯลฯ ) (ฉันไม่ได้ลวงคุณในรายละเอียด - หรือดีฉัน - แต่ฉันอยากรู้จริงๆฉันไม่ได้ดักฟังคุณเพื่อประโยชน์ของมัน)
Emanuel Berg

*nixเป็นเพียงวิธีการพูดว่า "ระบบปฏิบัติการยูนิกซ์ทั่วไปหรือระบบยูนิกซ์ที่คล้ายกัน" - เริ่มจากเวลาที่คำว่า Unix เป็นเครื่องหมายการค้าที่เป็นกรรมสิทธิ์ของ AT&T
cas

3

fold -s คือคำตอบสั้น ๆ และดีที่สุดสำหรับคำถามของคุณ

อย่างไรก็ตามโดยทั่วไปแล้วเครื่องมือที่มีวัตถุประสงค์เดียวนั้นดีในบางกรณีคุณควรให้เครื่องมือแก้ไขของคุณทำเช่นนี้

ใน Emacs คุณสามารถปรับแต่งสิ่งนี้ได้ตามต้องการ สำหรับฉันฉันใช้visual-line-mode(แสดงเป็นWrapโหมดย่อยในบรรทัดโหมด) เพราะในกรณีทั่วไปฉันไม่ต้องการให้มีการขึ้นบรรทัดใหม่ที่อื่นนอกเหนือจากตอนท้ายของย่อหน้า

ฉันคิดว่าฉันจะบอกวิธีที่ฉันทำ มันไม่ใช่วิธี "" แต่เป็นวิธีเดียว; เมื่อฉันพูดถึงฟังก์ชั่นและตัวแปรวิธีการของคุณคือการรวมมันเข้าด้วยกันและทำให้พวกมันเป็นแบบอัตโนมัติเพื่อให้มันทำงานให้คุณได้ (นี่คือ Emacs แต่สำหรับโปรแกรมแก้ไขขั้นสูงใด ๆ ที่เพียงพอก็สามารถเขียนโพสต์ที่คล้ายกันได้)

ฉันบอกว่าฉันมีเส้นที่พันด้วยสายตาเมื่อฉันพิมพ์และไม่ทำลายมันด้วยตนเอง และเช่นเคยมีข้อยกเว้น: ตัวอย่างเช่น GNUS จะไม่ส่งโพสต์ไปยัง Usenet โดยมีบรรทัดที่เกินความกว้างที่แน่นอน (เป็นตัวอักษร) M-qดังนั้นแล้วฉันจะใช้ ใน Emacs, รันคำสั่งM-q fill-paragraphตัวแปรfill-columnควบคุมความกว้างสำหรับการเติม ตัวอย่างเช่นถ้าฉันเขียนนี้ (ในบรรทัดเดียว)

This is a lot of text being written right now. The purpose is to overflow the line so I have have to line break it with M-q.

แล้วใช้ Mq ฉันเข้าใจ

This is a lot of text being written right now. The purpose is to
overflow the line so I have have to line break it with M-q.

ด้วยjustify-current-line(สองเท่าเป็นสองบรรทัด) คุณจะได้รับ

This  is a lot  of text  being written  right now.  The purpose  is to
overflow  the  line  so  I  have  have to  line  break  it  with  M-q.

แต่ฉันพบว่าผู้คนไม่ค่อยใช้แบบอักษร monospace เพื่อดูสิ่งต่าง ๆ ดังนั้นมันจึงไม่สมเหตุสมผลนักที่จะใช้มัน หากคุณชอบคุณสามารถปรับแต่งfill-paragraphเพื่อเติมและปรับในเวลาเดียวกัน คุณยังสามารถมี Emacs auto-fill-modeทำเพื่อคุณเสมอขณะที่คุณพิมพ์: (ฉันพบว่าเครียด แต่นั่นคือฉัน)

นี่อาจดูเหมือนงานมากและเป็น; แต่เมื่อคุณทำเสร็จแล้ว (จากสิ่งนี้และอีก 1,000 สิ่ง) คุณสามารถเพลิดเพลินกับการทำงานกับเครื่องมือที่ทำงานได้อย่างแม่นยำตามที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.