Чи є інструмент командного рядка, щоб вставити розриви рядків у довгий рядок?


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синтаксис не відображається на сторінці складки ?
ire_and_curses

5
Для нащадків також є fmt. Різниця між foldі fmtполягає в тому, що foldбуде обгортати фіксовану ширину, навіть розділяючи слова і може починати рядки з пробілів. Поки fmtбуде обгортатися поблизу або під шириною, вона не розділить слова, рядки не почнуться з пробілів, і короткі рядки можуть бути з'єднані.
bahamat

5
foldСхоже, поведінка схожа на те, fmtколи використовується -sваріант.
Cory Klein

смішно, я використав -w варіант, але він розділив його за допомогою char.
амфібій

6

Ось метод із використанням sed:

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

Але що це означає?
Річард

1
@ Richard Замініть 30 будь-яких символів, крім newline ( .\{30\}), тим же рядком ( &), а потім новим рядком .
Кріс Даун

6

Вся мета fmt(частина GNU coreutils та IIRC інші версії були включені з нікс-файлами, які не є GNU *, тому майже напевно вже встановлені) - переформатувати абзаци.

Однак є ще кращий інструмент, який називається par(для переформатування абзацу). Він може робити все, що fmtможе, але набагато більше можливостей контролювати точний вихідний формат.

Однією з багатьох справді приємних речей parє те, що це дуже розумно в роботі з цитуванням в електронних листах (навіть на декількох рівнях цитування) - дуже корисно ... У мене налаштований .vimrc, щоб натискання на F5 надсилало поточний абзац за номіналом.

Якщо він не упакований для вашого дистрибутива (він призначений для debian та похідних, можливо, і інших), пар можна знайти на веб- сайті http://www.nicemice.net/par/


Під "не-GNU * nixes" ви маєте на увазі "справжні" (а не "Unix-подібні") Unixes? (Інакше класний інструмент, здається.)
Емануель Берг

я маю на увазі тепер застарілі власні барахло * nixes.
cas

Це я думав, але чому ви тоді використовуєте зірочку? Я подумав, що це потрібно було постійно вводити "Unix-like" (для Linux тощо). (Я не переймаю вас деталями - або добре, я є, - але я дуже хочу знати, я не клопочу вас заради цього.)
Емануель Берг

*nixце лише спосіб сказати "generic unix або unix-подібні системи" - він датується часом, коли слово 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.

Але я виявив, що люди рідко використовують шрифти монопространства для перегляду речей, тому не було сенсу використовувати його (крім мого власного задоволення від перегляду). Якщо вам це подобається, ви можете налаштувати , fill-paragraphщоб заповнити і виправдати в той же час. Ви також можете мати Emacs зробити це для вас, завжди, як ви типу: auto-fill-mode. (Я виявив це стресовим, але це я.)

Це може здатися великою роботою, і це; але як тільки ти закінчиш (з цим та ще 1000 речами), ти можеш із задоволенням працювати з інструментами, ведучи себе точно так, як тобі подобається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.