Apakah ada alat baris perintah untuk menyisipkan jeda baris ke string panjang?


18

Diberikan string panjang yang perlu ditampilkan dengan lebar teks terbatas, apakah ada alat baris perintah di * nix yang mengubah string baris tunggal menjadi string multi-baris dengan setiap baris tidak lebih dari lebar teks yang diberikan?

Misalnya diberi string berikut

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

Saya ingin memformat seperti ini:

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

Jawaban:


24

Anda dapat mencoba foldperintah:

echo "$MYSTRING" | fold -w 30

2
+1, tetapi mungkin lebih baik ditulis sebagai echo $MYSTRING | fold -w 30, karena -30sintaks tidak muncul di halaman manual fold ?
ire_and_curses

5
Untuk anak cucu, ada juga fmt. Perbedaan antara folddan fmtadalah yang foldakan membungkus pada lebar tetap, bahkan memisahkan kata dan dapat memulai baris dengan kosong. Meskipun fmtakan membungkus dekat atau di bawah lebar, itu tidak akan membagi kata, garis tidak akan mulai dengan kosong dan garis pendek dapat digabungkan.
bahamat

5
foldtampaknya memiliki perilaku yang mirip dengan fmtketika -sopsi digunakan.
Cory Klein

lucu, saya menggunakan opsi -w tetapi membaginya dengan char.
amfibi

6

Inilah metode menggunakan sed:

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

Tapi apa artinya itu?
Richard

1
@Richard Ganti 30 karakter apa pun kecuali baris baru ( .\{30\}), dengan string yang sama ( &), diikuti oleh baris baru.
Chris Down

6

Seluruh tujuan fmt(bagian dari GNU coreutils, dan versi IIRC lainnya dimasukkan dengan non-GNU * nixes, sehingga hampir pasti telah diinstal) adalah untuk memformat ulang paragraf.

Namun, ada alat yang lebih baik yang disebut par(untuk reformatter paragraf). Ia dapat melakukan semua yang fmtdapat dilakukan, tetapi dengan lebih banyak opsi untuk mengontrol format output yang tepat.

Salah satu dari banyak hal yang sangat baik tentang paritu adalah sangat pintar tentang penanganan mengutip dalam email (bahkan beberapa tingkat mengutip) - sangat berguna ... Saya telah mengatur .vimrc saya sehingga memukul F5 mengirimkan paragraf saat ini melalui par.

Jika tidak dikemas untuk distro Anda (itu untuk debian dan turunannya, mungkin juga yang lain), par dapat ditemukan di http://www.nicemice.net/par/


Dengan "non-GNU * nixes", maksud Anda Unix "asli" (bukan "Unix-like")? (Sepertinya alat yang keren.)
Emanuel Berg

Maksud saya sekarang-nix sampah kepemilikan usang.
Kasus

Itulah yang saya pikirkan, tetapi mengapa Anda kemudian menggunakan tanda bintang? Saya pikir itu untuk berkeliling harus mengetik "Unix-like" sepanjang waktu (untuk Linux dll). (Saya tidak mengganggumu karena perincian - atau yah, saya - tapi saya benar-benar ingin tahu, saya tidak mengganggumu demi hal itu.)
Emanuel Berg

*nixhanyalah cara untuk mengatakan "generik unix atau sistem mirip-unix" - itu berasal dari masa ketika kata Unix adalah merek dagang milik AT&T
cas

3

fold -s adalah jawaban terpendek dan terbaik untuk pertanyaan Anda.

Namun, sebaik alat satu-tujuan itu dalam beberapa kasus, secara umum, Anda harus meminta editor Anda melakukan ini.

Di Emacs, Anda bisa men-tweak ini yang Anda inginkan. Sedangkan saya, saya menggunakan visual-line-mode(muncul sebagai Wrapmode minor di baris mode) karena dalam kasus umum, saya tidak ingin jeda baris di tempat lain selain di akhir paragraf.

Saya pikir saya akan mengatakan cara saya melakukannya. Ini bukan "jalan", tetapi itu satu jalan; seperti yang saya sebutkan fungsi dan variabel, cara Anda adalah menyatukannya dan mengotomatiskannya agar berfungsi untuk Anda. (Ini Emacs, tetapi untuk editor yang cukup mahir, tulisan serupa bisa ditulis.)

Saya bilang saya punya garis yang dibungkus secara visual saat saya mengetik, dan tidak pernah memutusnya secara manual. Seperti biasa, ada pengecualian: misalnya, GNUS tidak akan mengirim posting ke Usenet dengan garis di luar lebar tertentu (dalam karakter). Jadi, saya gunakan M-q. Di Emacs, M-qjalankan perintah fill-paragraph. Variabel fill-columnmengontrol lebar untuk mengisi. Sebagai contoh, jika saya menulis ini (dalam satu baris)

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.

dan kemudian gunakan Mq, saya mengerti

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.

Dengan justify-current-line(dua kali dua baris), Anda dapatkan

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.

Tapi, saya telah menemukan bahwa orang jarang menggunakan font monospace untuk melihat sesuatu, jadi tidak masuk akal menggunakannya (selain untuk kesenangan menonton saya sendiri). Jika Anda suka, Anda dapat mengubah fill-paragraphuntuk mengisi dan membenarkan pada saat yang sama. Anda juga bisa memiliki Emacs melakukan ini untuk Anda, selalu, saat Anda mengetik: auto-fill-mode. (Saya merasa tertekan, tapi itu saya.)

Ini mungkin tampak seperti banyak pekerjaan, dan memang demikian; tetapi begitu Anda selesai (dengan ini dan 1000 hal lainnya) Anda benar-benar dapat menikmati bekerja dengan alat berperilaku tepat seperti yang Anda inginkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.