Рейтинг:1

Строка Bash, разделенная разделителем, ограниченным количеством символов

флаг in

Я хочу разбить длинный текст, разделенный пробелами, через bash, но мне это не удается. Приведенная ниже команда разбивается на символы, но не на разделители.

echo "Быстрая лиса перепрыгнула через ленивую собаку" | сложить -w 10
echo "Быстрая лиса перепрыгнула через ленивую собаку" | sed -e 's/.\{9\}/&\n/g'

Было бы неплохо иметь его для некоторого взаимодействия с пользователем bash.

Синтаксис ввода

format_text 10 "Быстрая лиса перепрыгнула через ленивую собаку"

Вывод:

быстрый 
лиса прыгнула 
над 
Лентяй

Вы должны заметить, что третья строка отрезала бы букву «l» от «lazy», если бы не правило пробела.

Обновлять: Текущий результат хороший. Есть проблема с рабочим слайсером, который я не могу решить самостоятельно: он не разбивает слова до того, как будет превышен лимит.

#!/бин/баш

Заголовок печати () {
    объявить -i длина_строки=$3
    
    # Верхний и нижний заборы 
    локальная верхняя_команда = "печать \"$1\" *" 
    локальный upper_fence="$(python -c "$upper_command $line_length")"
    
    локальная нижняя_команда = "печать \"$2\" *"
    локальный нижний_забор = "$(python -c "$нижняя_команда $line_length")"
    
    # Разрезать слова по некоторому счетчику символов
    локальный regex_counter="s/(.{$line_length}) /\1\n/g"
    
    # Полная линия с точками и вертикальной чертой
    местный res="$line_length - длина"
    local repeat_pattern='$(repeat res \".\"; эхо)'
    local fill_command="{res=($res); printf \"%s%s|\n\", $0, $repeat_pattern}"

    эхо "$upper_fence"

    sed -r "$regex_counter" <<< $4

    эхо "$нижний_забор"
}

printHeader "#" "#" 10 "Быстрая лиса перепрыгнула через ленивую собаку"

Текущий вывод без окончательного токена:

##########
Быстрая лиса
перепрыгнул через
ленивая собака
##########
Bruno Henrique Peixoto avatar
флаг in
Я добавил примеры, как вы предложили
Bruno Henrique Peixoto avatar
флаг in
Отличный вопрос! Это открытый вопрос для проблемы. Мы можем пометить строку тегом
Bruno Henrique Peixoto avatar
флаг in
Но давайте возьмем случай, когда количество символов больше, чем самое большое слово. Кажется разумным для текста на естественном языке,
bac0n avatar
флаг cn
`| fmt -w 11` .. (думаю, вам тоже нужно считать новую строку)
Bruno Henrique Peixoto avatar
флаг in
Величественный ответ. Мне уже нормально! Если я хочу поставить какой-то разделитель для обозначения ограничения строки, сильно ли изменится код?
Рейтинг:2
флаг cn
sed -r 's/([^ .]+ [^ .]+) /\1\n/g' <<< "Быстрая лиса перепрыгнула через ленивую собаку"
быстрый
лиса прыгнула
над
Лентяй

Набор символов [^ .]+ означает один или несколько + персонажи любого типа . исключая ^ пробелы. Итак, группа захвата ([^ .]+ [^ .]+) соответствует шаблонам как строка строка. Все регулярное выражение имеет дополнительный пробел в конце ([^ .]+ [^ .]+) (можно было включить в группу захвата, чтобы сохранить).

С сед с помощью замены с командой мы заменяем совпадающий шаблон содержимым первой группы захвата \1 и новый символ строки \n вместо пробела. Под флагом г повторяем команду до конца каждой строки. опция активирует расширенные регулярные выражения.


Обновление - это фактический ответ:

sed -r 's/(.{8}) /\1\n/g' <<< "Откуда мы знаем, что он будет соответствовать предварительно определенному количеству символов?"
Как мы
знаю, что это
собираюсь
соответствовать
предопределенный
количество
символы?

В этом примере мы захватываем строки длиной не менее 8 символов (включая пробелы), за которыми следует пробел. Мы можем проверить фактическую длину выходных строк следующим образом:

sed -r 's/(.{8}) /\1\n/g' <<< "Откуда мы знаем, что он будет соответствовать предварительно определенному количеству символов?" \
    | awk '{длина печати}'
9
10
8
9
11
9
11

И с помощью ответов на вопрос Как использовать printf для печати символа несколько раз? [ага] мы можем добиться желаемого результата.

sed -r 's/(.{8}) /\1\n/g' <<< "Откуда мы знаем, что он будет соответствовать предварительно определенному количеству символов?" \
    | awk '{остальное=(12 - длина); printf "%s%s|\n", $0, substr(".........", 1, остальное)}'
Как мы...|
знаю, что это .. |
собираюсь....|
соответствовать...|
предопределено.|
количество...|
символы?.|

Если вы хотите разбить слова, удалите последний пробел из приведенного выше регулярного выражения. /(.{8})/. Вот пример, где максимальная длина строки будет ровно 10 символов или меньше, где второй сед команда будет обрезать пробелы вокруг каждой новой строки.

sed -r 's/(.{10})/\1\n/g' <<< "Откуда мы знаем, что он будет соответствовать предварительно определенному количеству символов?" \
    | sed -r 's/(^ | $)//g' \
    | awk '{остальное=(10 - длина); printf "%s%s|\n", $0, substr(".........", 1, остальное)}'
Как мы.|
знаю, что это |
собираюсь..|
соответствовать.|
предварительно определить |
d число о |
f персонаж|
р?.......|
Bruno Henrique Peixoto avatar
флаг in
Откуда мы знаем, что он будет соответствовать заранее определенному количеству символов?
pa4080 avatar
флаг cn
Привет, @BrunoHenriquePeixoto. Я обновил ответ небольшой шуткой на ваш вопрос.
Bruno Henrique Peixoto avatar
флаг in
ОТЛИЧНЫЙ! Последнее последнее желание, гений. Можете ли вы добавить вишенку сверху, разграничив последний символ (либо {max_val}, либо {max_val+1}).Может быть какой-то символ | или #, не имеет значения.
pa4080 avatar
флаг cn
@BrunoHenriquePeixoto, я не понял этого требования. Вероятно, вам нужно второе выражение: `sed -r -e 's/(.{8}) /\1\n/g' -e 's/(.)$/\|\1/'`, но я не уверен. Или, если вы хотите изменить каждую новую строку, самый ленивый способ - это вторая обработка: `sed -r 's/(.{8}) /\1\n/g' in-file.txt | sed -r 's/(.)$/\|\1/'`
Bruno Henrique Peixoto avatar
флаг in
Пример: Учитывая имя вашего профиля «pa4080» (6 цифр), максимальное количество 10 цифр в строке и разделительную черту «|» и точки для пробела в конце, вывод должен быть «pa4080....|», без двойного Котировки.
pa4080 avatar
флаг cn
@BrunoHenriquePeixoto, пожалуйста, проверьте обновление :)
Bruno Henrique Peixoto avatar
флаг in
Вы должны быть в зале славы Stack Overflow
Bruno Henrique Peixoto avatar
флаг in
Фрагмент substr кажется немного неаккуратным. Некоторые повторяющиеся рутины подходят лучше. Мы отлично поработали!
Bruno Henrique Peixoto avatar
флаг in
Есть проблема с sed, который мы реализовали. Взгляните на основную часть поста.
pa4080 avatar
флаг cn
Привет, @BrunoHenriquePeixoto, если вы хотите разбить слово, попробуйте удалить последний пробел из регулярного выражения: `/(.{8}) /` => `/(.{8}})/`. Я добавил обновление к ответу.
Bruno Henrique Peixoto avatar
флаг in
Я хочу дать больше котировок на ответ! :(! БЛАГОДАРНОСТЬ
Bruno Henrique Peixoto avatar
флаг in
голоса, объятия, деньги, калории, кредит, звезды, все, что имеет значение
pa4080 avatar
флаг cn
@BrunoHenriquePeixoto, вы можете просто проголосовать за него, нажав на стрелку вверх :)
Bruno Henrique Peixoto avatar
флаг in
Я буду голосовать каждый день своей жизни.
Bruno Henrique Peixoto avatar
флаг in
Ваша награда: https://github.com/brunolnetto/engage

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.