Подтвердить что ты не робот

Несколько строк, строка Truncate с 80 символами

Я новичок в awk и sed, и я ищу способ усечения строки с 80 символами, но я печатаю несколько строк в этой строке, используя printf. Последние две строки - это те, которые дают мне проблемы, потому что они различаются по размеру на каждой итерации моего кода. Вот мой текущий код:

printf "%5d  %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "$subject"

Этот код используется для создания сводки сообщений электронной почты, которые проходят через Bash script. То, что я знаю, это то, что с пробелами и требованиями других строк, у меня есть место для 60 символов между строками $from и $subject.

Любая помощь приветствуется.

4b9b3361

Ответ 1

Я ищу способ усечения строки с 80 символами...

Вы можете передать вывод на cut:

printf ... | cut -c 1-80

Если вы хотите, чтобы каждая строка не превышала 80 символов (или обертывание линий в соответствии с указанной шириной), вы можете использовать fold:

printf ... | fold -w 80

Ответ 2

Еще один способ решить это, используя Bash (синтаксис: ${var:0:80}), например:

printf "%5d  %3s%.2s %4s %s %s \n" "$f" "$month" "$day" "$year" "$from" "${subject::80}"

Это сокращает строку до того, как она дойдет до printf. Этот метод также позволит вам указать разные максимальные ширины для каждого печатного столбца отдельно.

Ответ 3

У меня была та же проблема, которая пыталась настроить мою приглашение bash с усеченным именем каталога. Работа над этим была:

PS1='\[email protected]\h:`echo $(basename $PWD) | cut -c 1-15`\$ '

Ответ 4

Как насчет версии C?

#include <stdio.h>
int maxline = 80;
int main(int argc, char* argv[])
{
    char line[2048];
    if ((argc>1) && (atoi(argv[1]) > 0)) {
        maxline = atoi(argv[1]);
    }
    while (fgets(line, sizeof(line), stdin)) {
        line[maxline] = '\0';
        printf("%s\n", line);
    }
}

Ответ 5

Вы можете использовать substr только для захвата 1-го n символов из и темы, так как вы знаете, что у вас есть максимум 60 символов, чтобы играть с вами, вы могли бы захватить 1-й 25-й из "от" и 1-го 35-го предмета ".

#!/usr/bin/gawk -f
BEGIN { 
 # set ouput delimiter to comma
 OFS=","
 #  set input delimiter to bar
 FS="|"  }

{
f=$1
month=$2
day=$3
year=$4
from=$5
subject=$6
from=substr(from,1,25) 
subject=substr(subject,1,35)
printf ("%5d,%3s%.2s,%4s,%s,%s\n",f,month,day,year,from,subject)
}

Запуск выше в этом файле

12123 | Jan | 14 | 1970 | [email protected] | "С днем ​​рождения" 14545 | Jan | 15 | 1970 | [email protected] | "Надеюсь, ваша голова в порядке" 27676 | Фев | 14 | 1970 | [email protected] | "Еще на сегодня?" 29898 | Фев | 14 | 1970 | [email protected] | "Конечно, если вы принесете шоколад". 34234 | Feb | 15 | 1970 | [email protected] | "Хорошо провел время прошлой ночью, надеюсь, вы тоже. Не могу дождаться выходных, любить Джека"

Возвращает

12123,Jan14,1970,[email protected],"Happy birthday"
14545,Jan15,1970,[email protected],"Hope your head is ok"
27676,Feb14,1970,[email protected],"Still on for tonight?"
29898,Feb14,1970,[email protected],"Sure, if you bring the chocolate."
34234,Feb15,1970,[email protected],"Had a great time last night, hope