Czy istnieje narzędzie wiersza polecenia do wstawiania podziałów linii w długi ciąg?

18

Biorąc pod uwagę długi ciąg, który musi być wyświetlany z ograniczoną szerokością tekstu, czy istnieje narzędzie wiersza poleceń w * nix, które konwertuje ciąg jednowierszowy na ciąg wieloliniowy, przy czym każdy wiersz nie jest dłuższy niż dana szerokość tekstu?

Na przykład, biorąc pod uwagę następujący ciąg

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

Chciałbym sformatować mniej więcej tak:

$ 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.
Cory Klein
źródło

Odpowiedzi:

24

Możesz spróbować wykonać foldpolecenie:

echo "$MYSTRING" | fold -w 30
Krzysztof
źródło
2
+1, ale być może lepiej napisane jako echo $MYSTRING | fold -w 30, ponieważ -30składnia nie pojawia się na stronie zagięcia ?
ire_and_curses
5
Dla potomnych jest też fmt. Różnica między foldi fmtpolega na tym, foldże zawija się na ustalonej szerokości, nawet dzieli słowa i może zaczynać wiersze spacjami. Chociaż fmtzawinie się w pobliżu lub poniżej szerokości, nie podzieli słów, linie nie będą zaczynać się spacjami i krótkie linie mogą zostać połączone.
bahamat
5
foldwydaje się mieć podobne zachowanie, jak w fmtprzypadku -sużycia tej opcji.
Cory Klein
zabawne, użyłem opcji -w, ale podzieliłem ją na char.
amfibia
6

Oto metoda wykorzystująca sed:

sed 's/.\{30\}/&\
/g'
Chris Down
źródło
Ale co to oznacza?
Richard
1
@Richard Zamień 30 dowolnych znaków oprócz newline ( .\{30\}) na ten sam ciąg ( &), po którym następuje nowa linia.
Chris Down,
6

Całkowitym celem fmt(części jądra GNU i innych wersji IIRC zostały dołączone do nixów innych niż GNU *, więc prawie na pewno będzie już zainstalowany) jest sformatowanie akapitów.

Istnieje jednak jeszcze lepsze narzędzie o nazwie par(do formatowania akapitu). Może zrobić wszystko, co w jego fmtmocy, ale z większą ilością opcji kontrolowania dokładnego formatu wyjściowego.

Jedną z wielu naprawdę fajnych rzeczy parjest to, że jest bardzo sprytny w obsłudze cytowania w wiadomościach e-mail (nawet na wielu poziomach cytowania) - bardzo przydatny ... Mam skonfigurowane moje .vimrc, tak że naciśnięcie F5 powoduje wysłanie bieżącego akapitu przez par.

Jeśli nie jest spakowany dla twojej dystrybucji (dotyczy Debiana i pochodnych, prawdopodobnie także innych), par można znaleźć na stronie http://www.nicemice.net/par/

cas
źródło
Czy przez „nixe inne niż GNU *” masz na myśli „prawdziwe” (a nie „uniksopodobne”) uniksy? (Wygląda na to, że to fajne narzędzie.)
Emanuel Berg,
mam na myśli teraz przestarzałe własnościowe śmieci *.
cas
Tak myślałem, ale dlaczego używasz gwiazdki? Pomyślałem, że chodzi o to, żeby cały czas pisać „uniksopodobny” (dla Linuksa itp.). (Nie wkurzam cię szczegółami - a właściwie jestem - ale naprawdę chcę wiedzieć, nie wkurzam cię ze względu na to.)
Emanuel Berg
*nixto tylko sposób na powiedzenie „ogólny system uniksowy lub system uniksopodobny” - pochodzi z czasów, gdy słowo Unix było zastrzeżonym znakiem towarowym AT&T
cas
3

fold -s jest najkrótszą, najlepszą odpowiedzią na twoje pytanie.

Jednak w niektórych przypadkach są one tak dobre, jak narzędzia uniwersalne, jednak powinieneś poprosić o to swojego edytora.

W Emacsie możesz to zmienić w dowolny sposób. Jeśli chodzi o mnie, używam visual-line-mode(pokazuje się jako Wrapmniejszy tryb w linii trybu), ponieważ w ogólnym przypadku nie chcę łamania linii nigdzie indziej niż na końcu akapitów.

Myślałem, że powiem, jak to robię. To nie jest „droga”, ale jedna droga; jak już wspominam o funkcjach i zmiennych, waszym sposobem jest ich połączenie i zautomatyzowanie, aby działały dla ciebie. (To jest Emacs, ale dla każdego wystarczająco zaawansowanego edytora można napisać podobny post.)

Powiedziałem, że mam wizualnie zawijane linie podczas pisania i nigdy nie łamię ich ręcznie. Jak zawsze, są wyjątki: na przykład GNUS nie wysyła postów do Usenetu z liniami przekraczającymi określoną szerokość (w znakach). Więc używam M-q. W Emacsie M-quruchamia polecenie fill-paragraph. Zmienna fill-columnkontroluje szerokość napełniania. Na przykład, jeśli napiszę to (w jednym wierszu)

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.

i używam Mq, rozumiem

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.

Z justify-current-line(dwa razy więcej niż dwie linie), dostajesz

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.

Odkryłem jednak, że ludzie rzadko używają czcionek o jednolitej przestrzeni do przeglądania rzeczy, więc używanie go nie miało sensu (poza moją przyjemnością oglądania). Jeśli Ci się spodoba, możesz dostosować, fill-paragraphaby wypełnić i uzasadnić w tym samym czasie. Można również mieć Emacs zrobić dla ciebie, zawsze, jak piszesz: auto-fill-mode. (Stresowałem się, ale to ja.)

To może wydawać się dużo pracy i tak jest; ale kiedy skończysz (z tym i 1000 innymi rzeczami), możesz naprawdę cieszyć się pracą z narzędziami zachowującymi się dokładnie tak, jak lubisz.

Emanuel Berg
źródło