Uzun bir dizeye satır sonu eklemek için bir komut satırı aracı var mı?


18

Sınırlı metin genişliğiyle görüntülenmesi gereken uzun bir dize verildiğinde, * nix'te tek satırlık dizeyi çok satırlı bir dizeye dönüştüren bir komut satırı aracı var mı?

Örneğin, aşağıdaki dize verildiğinde

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

Ben biraz böyle biçimlendirmek istiyorum:

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

Yanıtlar:


24

foldKomutu deneyebilirsiniz :

echo "$MYSTRING" | fold -w 30

2
+1, ancak belki de daha iyi yazılmıştır echo $MYSTRING | fold -w 30, çünkü -30sözdizimi fold man sayfasında görünmüyor mu?
ire_and_curses

5
Gelecek kuşak için de var fmt. Arasındaki fark foldve fmtyani fold, sabit genişlikte da bölme kelimeleri kaydırma ve boşlukları ile çizgileri başlayabilir. İken fmtyakın veya genişliği altında kaydırılır, bu bölünmüş kelimeler, çizgiler kurusıkı başlamaz olmayacak ve kısa çizgiler birleştirilebilir.
Bahama

5
foldbenzer davranışa sahip görünmektedir fmtzaman -sseçeneği kullanılır.
Cory Klein

komik, ben -w seçeneği kullanılan ama char tarafından bölünmüş.
13'te ampüratör

6

İşte bir yöntem sed:

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

Ama bu ne demek?
Richard

1
@Richard newline ( .\{30\}) dışında herhangi bir karakterin 30'unu aynı dize ( &) ile ve ardından bir newline ile değiştirin.
Chris Down

6

Tüm amacı fmtbiçimlendirmek paragrafların etmektir (GNU coreutils ve IIRC diğer sürümleri parçası yüzden zaten yüklü olması neredeyse kesin olmayan GNU * nixes ile alındı).

Ancak, daha iyi bir araç var par(paragraf yeniden biçimlendirici için). Yapabileceği her şeyi fmtyapabilir, ancak kesin çıktı biçimini kontrol etmek için çok daha fazla seçenekle.

Hakkında gerçekten çok güzel şeylerden biri, pare-postalarda alıntı yapmakla ilgili çok akıllı olmasıdır (hatta birden fazla alıntı seviyesi) - çok yararlı ... F5'e vurmak geçerli paragrafı par üzerinden gönderecek şekilde .vimrc ayarladım.

Dağıtımınız için paketlenmemişse (debian ve türevleri için, muhtemelen diğerleri için), par http://www.nicemice.net/par/ adresinde bulunabilir.


"GNU olmayan * nixes" ile "gerçek" ("Unix benzeri değil") Unix'leri mi kastediyorsunuz? (Aksi takdirde harika bir araç, öyle görünüyor.)
Emanuel Berg

şimdi eskimiş özel önemsiz * nixes demek istiyorum.
cas

Ben de öyle düşünmüştüm, ama neden yıldız işaretini kullanıyorsun? Ben her zaman (Linux vb.) "Unix benzeri" yazmak zorunda dolaşmak olduğunu düşündüm. (Seni bir detay üzerinde rahatsız etmiyorum - ya da ben, ama - gerçekten bilmek istiyorum, bunun uğruna seni rahatsız etmiyorum.)
Emanuel Berg

*nix"genel unix veya unix benzeri sistemler" demenin bir yoludur - Unix kelimesinin AT&T'nin tescilli ticari markası olduğu bir zamana dayanır
cas

3

fold -s sorunuzun en kısa, en iyi yanıtıdır.

Ancak, bu tek amaçlı araçların bazı durumlarda olduğu kadar iyi, genel olarak, editörünüzün bunu yapmasını sağlamalısınız.

Emacs'ta bunu istediğiniz gibi değiştirebilirsiniz. Bana gelince, kullanıyorum visual-line-mode( Wrapmod satırında küçük bir mod olarak görünür) çünkü genel durumda, paragrafların sonundan başka hiçbir yerde satır sonları istemiyorum.

Bunu nasıl yapacağımı söyleyeceğimi düşündüm. Bu "yol" değildir, ama bir yoludur; Ben fonksiyonları ve değişkenleri söz olarak, sizin yolu onları biraraya koymak ve sizin için onları çalışması için onları otomatik hale getirmek olduğunu. (Bu Emacs, ancak yeterince gelişmiş bir editör için benzer bir yazı yazılabilir.)

Ben yazarken satırları görsel olarak sarılmış ve asla elle kırmak dedim. Her zaman olduğu gibi, istisnalar vardır: örneğin, GNUS, Usenet'e belirli bir genişliğin ötesinde (karakter olarak) çizgilerle yayınlar göndermez. O zaman kullanıyorum M-q. Emacs'ta M-qkomutu çalıştırır fill-paragraph. Değişken fill-columndoldurma genişliğini kontrol eder. Örnek olarak, bunu yazarsam (tek bir satıra)

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.

ve sonra Mq kullanıyorum

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.

İle justify-current-line(iki kez iki gibi çizgilerden) elde edersiniz

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.

Ancak, insanların şeyleri görüntülemek için nadiren tek aralıklı yazı tipleri kullandıklarını gördüm, bu yüzden onu kullanmak çok mantıklı değildi (kendi görüntüleme zevkim dışında). İsterseniz , aynı anda fill-paragraphdoldurmak ve haklı göstermek için ince ayar yapabilirsiniz . Ayrıca Yazarken Emacs hep sizin için bunu olabilir: auto-fill-mode. (Bunu stresli buldum, ama o benim.)

Bu çok fazla iş gibi görünebilir ve öyle; ancak işiniz bittiğinde (bu ve diğer 1000 şeyle) tam istediğiniz gibi davranan araçlarla çalışmanın keyfini çıkarabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.