web-dev-qa-db-fra.com

Chaînes multiples, ligne tronquée à 80 caractères

Je suis nouveau dans awk et sed, et je cherche un moyen de tronquer une ligne à 80 caractères, mais j'imprime plusieurs chaînes dans cette ligne en utilisant printf. Les deux dernières chaînes sont celles qui me posent des problèmes car elles varient en taille à chaque itération de mon code. Voici mon code actuel:

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

Ce code est utilisé pour créer un résumé des e-mails transmis via un script Bash. Ce que je sais, c'est qu'avec les espaces et les exigences de mes autres chaînes, j'ai de la place pour 60 caractères entre les chaînes $ from et $ subject.

Toute aide est appréciée.

41
TZPike05

Je cherche un moyen de tronquer une ligne à 80 caractères ...

Vous pouvez diriger la sortie vers cut:

printf ... | cut -c 1-80

Si vous voulez vous assurer que chaque ligne ne dépasse pas 80 caractères (ou encapsuler les lignes pour qu'elles tiennent dans la largeur spécifiée), vous pouvez utiliser fold:

printf ... | fold -w 80
107
devnull

Une autre façon de résoudre ce problème en utilisant simplement Bash (syntaxe: ${var:0:80}), par exemple.:

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

Cela tronque la chaîne avant d'arriver à printf. Cette méthode vous permettrait également de spécifier des largeurs maximales différentes pour chaque colonne imprimée individuellement.

18
Aaron R.

J'ai eu le même problème en essayant de personnaliser mon invite bash avec un nom de répertoire tronqué. Ce qui a finalement fonctionné était:

PS1='\u@\h:`echo $(basename $PWD) | cut -c 1-15`\$ '
2
user5925630

Que diriez-vous d'une version 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);
    }
}
1
ChuckCottrill

Vous pouvez utiliser substr pour saisir uniquement les n premiers caractères de from et subject, car vous savez que vous ne disposez que d'un maximum de 60 caractères pour jouer avec vous pouvez saisir les 25 premiers de 'from' et les premiers 35 de 'subject'.

#!/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)
}

Exécution de ce qui précède sur ce fichier

12123 | Jan | 14 | 1970 | [email protected] | "Joyeux anniversaire" 14545 | Jan | 15 | 1970 | [email protected] | "J'espère que votre tête va bien" 27676 | Fév | 14 | 1970 | jack @ overthehill .com | "Toujours ce soir?" 29898 | Fév | 14 | 1970 | [email protected] | "Bien sûr, si vous apportez le chocolat." 34234 | Fév | 15 | 1970 | [email protected] | "Nous avons passé un bon moment la nuit dernière, j'espère que vous aussi. J'ai hâte de passer le week-end, j'adore Jack"

Résultats

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
1
Peter Kelly