2010-06-07 2 views
1

Salut je voudrais envelopper les données séparées par des virgules suivante:Emballage de séparées par des virgules données dans bash à une longueur de ligne fixe

-X, run, abs, absolute, accept, accept, alarm, schedule, atan2, arctangent, bind, binds, binmode, prepare, bless, create, caller, get, chdir, change, chmod, changes, chomp, remove, chop, remove, chown, change, chr, get, chroot, make, close, close, closedir, close, connect, connect, continue, optional, cos, cosine, crypt, one-way, dbmclose, breaks, dbmopen, create, defined, test, delete, deletes, die, raise, do, turn, dump, create, each, retrieve, endgrent, be, endhostent, be, endnetent, be, endprotoent, be, endpwent, be, endservent, be, eof, test, eval, catch, exec, abandon, exists, test, exit, terminate, exp, raise, fcntl, file, fileno, return, flock, lock, fork, create, format, declare, formline, internal, getc, get, getgrent, get, getgrgid, get, getgrnam, get, gethostbyaddr, get, gethostbyname, get, gethostent, get, getlogin, return, getnetbyaddr, get, getnetbyname, get, getnetent, get, getpeername, find, getpgrp, get, getppid, get, getpriority, get, getprotobyname, get, getprotobynumber, get, getprotoent, get, getpwent, get, getpwnam, get, getpwuid, get, getservbyname, get, getservbyport, get, getservent, get, getsockname, retrieve, getsockopt, get, glob, expand, gmtime, convert, goto, create, grep, locate, hex, convert, import, patch, int, get, ioctl, system-dependent, join, join, keys, retrieve, kill, send, last, exit, lc, return, lcfirst, return, length, return, link, create, listen, register, local, create, localtime, convert, log, retrieve, lstat, stat, m//, match, map, apply, mkdir, create, msgctl, SysV, msgget, get, msgrcv, receive, msgsnd, send, my, declare, next, iterate, no, unimport, oct, convert, open, open, opendir, open, ord, find, pack, convert, package, declare, pipe, open, pop, remove, pos, find, print, output, printf, output, prototype, get, push, append, q/STRING/, singly, qq/STRING/, doubly, quotemeta, quote, qw/STRING/, quote, qx/STRING/, backquote, rand, retrieve, read, fixed-length, readdir, get, readlink, determine, recv, receive, redo, start, ref, find, rename, change, require, load, reset, clear, return, get, reverse, flip, rewinddir, reset, rindex, right-to-left, rmdir, remove, s///, replace, scalar, force, seek, reposition, seekdir, reposition, select, reset, semctl, SysV, semget, get, semop, SysV, send, send, setgrent, prepare, sethostent, prepare, setnetent, prepare, setpgrp, set, setpriority, set, setprotoent, prepare, setpwent, prepare, setservent, prepare, setsockopt, set, shift, remove, shmctl, SysV, shmget, get, shmread, read, shmwrite, write, shutdown, close, sin, return, sleep, block, socket, create, socketpair, create, sort, sort, splice, add, split, split, sprintf, formatted, sqrt, square, srand, seed, stat, get, study, optimize, sub, declare, substr, get, symlink, create, syscall, execute, sysread, fixed-length, system, run, syswrite, fixed-length, tell, get, telldir, get, tie, bind, time, return, times, return, tr///, transliterate, truncate, shorten, uc, return, ucfirst, return, umask, set, undef, remove, unlink, remove, unpack, convert, unshift, prepend, untie, break, use, load, utime, set, values, return, vec, test, wait, wait, waitpid, wait, wantarray, get, warn, print, write, print, y///, transliterate, 

de telle sorte qu'un saut de ligne est ajouté à la dernière virgule avant une ligne 70 de caractères longueur. Préférable cela pourrait être fait dans une sorte de bash un paquebot.

Répondre

7
echo 'your, text, here' | fold -sw 70 

Cela devrait vous donner la sortie que vous voulez. Au lieu d'utiliser echo, vous pouvez le rediriger depuis un fichier ou n'importe où d'où vous l'obtenez, ou vous pouvez simplement utiliser directement la commande fold et la coller sur stdin. Le "-w 70" dans le pli lui dit d'envelopper après 70 caractères par ligne, et le -s lui dit d'envelopper les espaces après chaque virgule.

+0

+1 Parfait, merci. Le SO devrait permettre des réponses immédiates et acceptées, mais je suppose qu'il y a un délai de deux minutes. –

+0

Merci beaucoup, vous avez finalement heurté ma réputation assez haut pour poster des commentaires! :) Et heureux je pourrais aider! – cecilkorik

+0

Notez que cela suppose qu'il n'y a pas d'espaces dans les éléments de la liste séparée par des virgules; il ne cherche pas vraiment les virgules, il cherche seulement des espaces. – intuited

3

En réponse à vos comment sur des cas où les espaces peuvent être Blottie entre les virgules:

Je pense que vous êtes sur la bonne voie avec l'utilisation sed. Une option que vous auriez est de mapper tous les espaces à un caractère inutilisé, puis de mapper les virgules en espaces, fold, puis de rétablir les mappages d'origine. Mais je pense que cela vous laissera avec des choses étranges comme des lignes qui commencent par des espaces. Il semble donc que vous voudriez juste remapper tout espace non précédé d'une virgule sur un caractère ou une séquence dont vous savez qu'il n'est pas présent dans le texte, puis inverser pour les rétablir.

Par exemple,

echo "$blahblah" | sed 's/\([^,]\) /\1\t/g' | fold -s | sed 's/\t/ /g 

fonctionnerait s'il n'y a pas de caractères de tabulation dans le texte, et s'il ne va pas être des espaces intégrés consécutifs.

S'il y a, je pense que vous aurez besoin d'utiliser quelque chose d'un peu plus complexe comme

echo "$blahblah" | \ 
    perl -pe 's/([^, ])(+)/$1 . "_" x length($2)/ge' | \ 
    fold -s | \ 
    tr _ ' ' 

Le /ge fait évaluer chaque valeur de substitution comme une expression Perl.

Le tr à la fin est fondamentalement équivalent à la fermeture sed dans la dernière commande.

Ceci suppose que le caractère "_" n'est pas garanti ne pas apparaître dans votre texte source. Il y a certainement de meilleurs caractères à choisir, par ex. un caractère de contrôle inutilisé comme, disons,^V. Si vous utilisez un perl moderne pour faire la traduction à la fin, vous pouvez, je pense, utiliser un caractère unicode multi-octet obscur.

Cette suggestion est assez spontanée, et a quelques problèmes évidents. Par exemple, il ne se cassera pas après une virgule, sauf s'il y a un espace là. Ce n'est peut-être pas ce que vous voulez. Cela peut valoir la peine de faire quelques recherches sur CPAN/PyPI/etc. pour quelque chose de plus robuste. Ou vous pouvez écrire votre propre utilitaire de pliage ...

Questions connexes