Có một công cụ dòng lệnh để chèn ngắt dòng thành một chuỗi dài?


18

Đưa ra một chuỗi dài cần được hiển thị với độ rộng văn bản giới hạn, có công cụ dòng lệnh nào trong * nix chuyển đổi chuỗi đơn thành chuỗi nhiều dòng với mỗi dòng không dài hơn độ rộng văn bản nhất định không?

Ví dụ, đưa ra chuỗi sau

$ 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."

Tôi muốn định dạng như thế này:

$ 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.

Câu trả lời:


24

Bạn có thể thử foldlệnh:

echo "$MYSTRING" | fold -w 30

2
+1, nhưng có lẽ được viết tốt hơn vì echo $MYSTRING | fold -w 30, -30cú pháp không xuất hiện trong trang web gấp ?
ire_and_curses

5
Đối với hậu thế, cũng có fmt. Sự khác biệt giữa foldfmtfoldsẽ bao bọc ở độ rộng cố định, thậm chí chia các từ và có thể bắt đầu các dòng bằng khoảng trắng. Mặc dù fmtsẽ bao bọc gần hoặc dưới chiều rộng, nó sẽ không phân chia các từ, các dòng sẽ không bắt đầu bằng khoảng trắng và các dòng ngắn có thể được nối.
bahamat

5
folddường như có hành vi tương tự như fmtkhi -stùy chọn được sử dụng.
Cory Klein

buồn cười, tôi đã sử dụng tùy chọn -w nhưng nó chia nó bằng char.
lưỡng cư

6

Đây là một phương pháp sử dụng sed:

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

Nhưng nó có nghĩa gì?
Richard

1
@Richard Thay thế 30 của bất kỳ ký tự nào ngoại trừ dòng mới ( .\{30\}), bằng cùng một chuỗi ( &), theo sau là một dòng mới.
Chris Xuống

6

Toàn bộ mục đích của fmt(một phần của GNU coreutils và các phiên bản khác của IIRC được bao gồm với các phần tử không phải GNU *, do đó gần như chắc chắn đã được cài đặt) là để định dạng lại các đoạn.

Tuy nhiên, có một công cụ thậm chí còn tốt hơn được gọi là par(đối với cải cách đoạn). Nó có thể làm mọi thứ fmtcó thể làm, nhưng với nhiều tùy chọn hơn để kiểm soát định dạng đầu ra chính xác.

Một trong nhiều điều thực sự hay parlà nó rất thông minh trong việc xử lý trích dẫn trong email (thậm chí nhiều cấp độ trích dẫn) - rất hữu ích ... Tôi đã thiết lập .vimrc của mình để nhấn F5 gửi đoạn hiện tại qua mệnh.

Nếu nó không được đóng gói cho bản phân phối của bạn (nó dành cho debian và các dẫn xuất, có thể cả những thứ khác nữa), có thể tìm thấy mệnh giá tại http://www.nicemice.net/par/


Với "non-GNU * nixes", bạn có nghĩa là các Unix "thực" (không phải "giống như Unix") không? (Có vẻ như công cụ tuyệt vời này.)
Emanuel Berg

ý tôi là rác độc quyền đã lỗi thời * nixes.
cas

Đó là những gì tôi nghĩ, nhưng tại sao bạn lại sử dụng dấu hoa thị? Tôi nghĩ rằng đó là để có được xung quanh phải gõ "giống như Unix" mọi lúc (đối với Linux, v.v.). (Tôi không làm phiền bạn về một chi tiết - hoặc tốt, tôi - nhưng tôi thực sự muốn biết, tôi không làm phiền bạn vì lợi ích của nó.)
Emanuel Berg

*nixchỉ là một cách để nói "các hệ thống unix chung hoặc giống như unix" - nó xuất hiện từ thời mà từ Unix là nhãn hiệu độc quyền của AT & T
cas

3

fold -s là câu trả lời ngắn nhất, tốt nhất cho câu hỏi của bạn.

Tuy nhiên, tốt như những công cụ một mục đích đó trong một số trường hợp, nói chung, bạn nên nhờ biên tập viên của mình làm việc này.

Trong Emacs, bạn có thể tinh chỉnh điều này bằng mọi cách bạn muốn. Đối với tôi, tôi sử dụng visual-line-mode(hiển thị dưới dạng một Wrapchế độ nhỏ trong dòng chế độ) bởi vì trong trường hợp chung, tôi không muốn ngắt dòng ở bất kỳ nơi nào khác ngoài cuối đoạn văn.

Tôi nghĩ tôi sẽ nói theo cách tôi làm. Đó không phải là "cách", mà là một cách; Như tôi đã đề cập đến các hàm và biến, cách của bạn là đặt chúng lại với nhau và tự động hóa chúng để làm cho chúng hoạt động cho bạn. (Đây là Emacs, nhưng đối với bất kỳ biên tập viên đủ nâng cao nào, một bài viết tương tự có thể được viết.)

Tôi nói rằng tôi có các dòng được bọc trực quan khi tôi gõ và không bao giờ ngắt chúng bằng tay. Như mọi khi, có các trường hợp ngoại lệ: ví dụ: GNUS sẽ không gửi bài đăng tới Usenet với các dòng vượt quá độ rộng nhất định (tính bằng ký tự). Vì vậy, sau đó tôi sử dụng M-q. Trong Emacs, M-qchạy lệnh fill-paragraph. Biến fill-columnđiều khiển chiều rộng để điền. Ví dụ, nếu tôi viết cái này (trên một dòng)

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.

và sau đó sử dụng Mq, tôi nhận được

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.

Với justify-current-line(hai lần hai dòng), bạn nhận được

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.

Nhưng, tôi đã thấy rằng mọi người hiếm khi sử dụng phông chữ đơn cách để xem mọi thứ, vì vậy nó không có ý nghĩa gì khi sử dụng nó (ngoài niềm vui xem của riêng tôi). Nếu bạn thích nó, bạn có thể điều chỉnh fill-paragraphđể điền biện minh cùng một lúc. Bạn cũng có thể yêu cầu Emacs làm điều này cho bạn, luôn luôn, khi bạn gõ : auto-fill-mode. (Tôi thấy căng thẳng, nhưng đó là tôi.)

Điều này có vẻ như rất nhiều công việc, và nó là; nhưng một khi bạn đã hoàn thành (với điều này và 1000 thứ khác), bạn thực sự có thể thích làm việc với các công cụ hoạt động chính xác như bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.