$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
то есть я хочу добавить \n
после 72 символов и продолжить, поэтому сначала вам может понадобиться удалить все одиночные \n
буквы и добавить их. Может быть проще с другим инструментом, но давайте попробуем awk.
[Обновить]
Уильямсон дал правильный ответ, но для его прочтения понадобилась помощь. Я разбил проблему на части с более простыми примерами ниже.
Почему код ниже печатается
\t
в обоих случаях,gsub
должны заменить вещи? x - фиктивный файл, в конце нечетный 0.Нападая на строку
line = $0 \n more = getline \n gsub("\t"," ")
в ответе Уильямсона ,line
очевидно, получает полный вывод, в то время какmore
получает повышенное значение$0
, верно?
Код к части 1
$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena tjena2
tjena tjena20
источник
Не используя awk
Я понимаю, что это может быть просто частью более крупной проблемы, которую вы пытаетесь решить с помощью
awk
или просто попыткой лучше понять awk, но если вы действительно просто хотите сохранить длину строки до 72 столбцов, есть гораздо лучший инструмент.fmt
Инструмент был разработан с конкретно это в виду:fmt
также постараюсь разбить строки в разумных местах, делая вывод более приятным для чтения. Смотритеinfo
страницу для более подробной информации о том, чтоfmt
считает "разумные места".источник
width
есть байты, а не символы.fold -s -w 72
fold
будет работать и на системах GNU (поставляется с GNUcoreutils
).Awk является языком, полным по Тьюрингу, и не особенно запутанным, поэтому обрезать строки достаточно просто. Вот простая и обязательная версия.
Если вы хотите обрезать строки между словами, вы можете закодировать их в awk, но распознавать слова нетривиально (по причинам, связанным больше с естественными языками, чем с алгоритмическими сложностями). Во многих системах есть утилита,
fmt
которая делает это.источник
Вот функция Awk, которая разбивается на пробелы:
Неожиданно это более производительным , чем сложить или FMT .
Источник
источник
Вы спросили, почему
awk
код генерирует вкладки и откуда взялся ноль.Код не изменяет
hello
строку сgsub()
вызовами. С двумя аргументамиgsub()
действует на$0
. Чтобы реально изменитьhallo
переменную, используйтеgsub(..., ..., hallo)
.Вы получаете ноль в конце строки, потому что
gsub()
возвращает количество выполненных замен, и в какой-то момент вы добавляете это число к значениюhallo
.Мне известны как минимум три утилиты, специально предназначенные для переноса и форматирования текстовых абзацев:
fold
, «фильтр для складывания линий», который является стандартной утилитой POSIX . Он просто вставляет новые строки и не переформатирует текст.fmt
, «простой форматировщик текста», который также часто устанавливается по умолчанию в системах Unix и намного умнее, чемfold
когда дело доходит до перекомпоновки абзацев.par
, « фильтр для переформатирования абзацев », который имеет дополнительные возможности для определения префиксов и суффиксов абзацев (таких как текст с рамкой ASCII вокруг него или комментарии в небольшом количестве исходного кода), и обрабатывает отступы и висячие отступы чуть лучше чемfmt
.источник
Используя gensub, чтобы получить
fold
семантику, вы можете запустить что-то вродеисточник