Enchimento duro

1

Dado este arquivo:

$ cat file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lima mike
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

Eu gostaria de quebrar duro aos 70 anos, mas também gostaria de reabastecer. eu tentei "fold", mas não foi reabastecido:

$ fold -w 70 file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

"fmt" será reabastecido, mas eu só consegui que ele quebrasse nos espaços, então não há garantia de embrulhe exatamente 70:

$ fmt file
alfa bravo charlie delta echo foxtrot golf hotel india juliet
kilo lima mike november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

Eu tentei "pr", mas parece que apenas trunca a linha sem envolver:

$ pr -t -W 70 file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
november oscar papa quebec romeo sierra tango
uniform_victor_whiskey_xray yankee zulu

Talvez esses comandos tenham alguma opção que estou perdendo, ou talvez Awk ou Sed solução. Eu preferiria evitar soluções mais pesadas (Perl PHP Ruby).

    
por Steven Penny 03.03.2018 / 06:02

2 respostas

2

Usando sed

Com o GNU sed:

$ sed -zE 's/\n/ /g; s/.{70}/&\n/g; s/$/\n/' file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike november oscar papa quebec romeo sierra tango uniform_victor_wh
iskey_xray yankee zulu 

com qualquer POSIX sed:

sed -zE 'H;1h;$!d;x; s/\n/ /g; s/.{70}/&\n/g; s/$/\n/' file

Usando o awk

$ awk  '{r=(length(r)?r" "$0:$0); while(length(r)>70){print substr(r,1,70); r=substr(r,71)}} END{print r}' file
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike november oscar papa quebec romeo sierra tango uniform_victor_wh
iskey_xray yankee zulu

Com tr e fold

$ tr '\n' ' ' <file | fold -w 70
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike november oscar papa quebec romeo sierra tango uniform_victor_wh
iskey_xray yankee zulu

O texto acima não produz uma nova linha à direita, mas podemos adicionar um, se necessário, com echo "" :

tr '\n' ' ' <file | fold -w 70; echo
    
por 03.03.2018 / 06:09
1

Isso não funciona em todos os casos, mas deve cobrir a maioria dos casos de uso:

$ fmt -w 2500 file | fold -w 70
alfa bravo charlie delta echo foxtrot golf hotel india juliet kilo lim
a mike november oscar papa quebec romeo sierra tango uniform_victor_wh
iskey_xray yankee zulu
    
por 03.03.2018 / 06:19

Tags