Существует ли инструмент командной строки для вставки разрывов строк в длинную строку?

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обтекание будет иметь ширину около или ниже ширины, оно не будет разбивать слова, строки не будут начинаться с пробелов, и короткие строки могут быть объединены.
багамат
5
foldпохоже, ведет себя аналогично тому, fmtкогда эта -sопция используется.
Кори Кляйн
Забавно, я использовал опцию -w, но она делится на символы.
амфибия
6

Вот метод, использующий sed:

sed 's/.\{30\}/&\
/g'
Крис Даун
источник
Но что это значит?
Ричард
1
@Richard Замените 30 любого символа, кроме newline ( .\{30\}), той же строкой ( &), за которой следует символ новой строки.
Крис Даун
6

Вся цель fmt(часть GNU coreutils и других версий IIRC была включена в не-GNU * nixes, поэтому почти наверняка уже установлены) состоит в том, чтобы переформатировать абзацы.

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

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

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

саз
источник
Под "не-GNU * nixes" вы подразумеваете "настоящие" (не "Unix-подобные") Unixes? (В остальном классный инструмент, кажется.)
Эмануэль Берг
Я имею в виду устаревшие проприетарные ненужные * nixes.
Cas
Я так и думал, но почему вы тогда используете звездочку? Я подумал, что нужно обходиться с необходимостью постоянно вводить «Unix-like» (для Linux и т. Д.). (Я не задаюсь вопросом о деталях - или хорошо, я - но я действительно хочу знать, я не задаю вам вопросы ради этого.)
Эмануэль Берг
*nixэто просто способ сказать «универсальные 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 другими вещами), вам действительно понравится работать с инструментами, которые ведут себя именно так, как вам нравится.

Эмануэль Берг
источник