Példa:
Van egy pár soros szöveg amit szeretnék max 80 karakterre szétszedni úgy, hogy közben a sorokat számoljuk.
Tehát ha most ezt mint a második sort is számolom akkor úgy látom, hogy már ez több mint 80 karakter, tehát ideje lenne szétkapni.
A felső két sort hogy tudom úgy szétszedni, hogy számolva a sorok számát is 4-et kapjak, tehát a
Megoldás:
1. Van egy pár soros szöveg amit szeretnék max 80 karakterre szétszedni úgy,
2. hogy közben a sorokat számoljuk.
3. Tehát ha most ezt mint a második sort is számolom akkor úgy látom, hogy
4. már ez több mint 80 karakter, tehát ideje lenne szétkapni.
Bash lenne a legjobb, de kiegyezek bármivel.
Hozzászólások
Esetleg Ubuntu Manpage: fmt - simple optimal text formatter?
AL
Megnézem, köszönöm.
Ott a pont: fmt -80 -s textfile.txt
- Jön a szöveg, stdin, vagy file, tökmindegy, lényeg, hogy ciklusban olvasod, pl. while read -r blabla
- Elkezded olvasni szavanként, a szót a végét követő karakterrel együtt változóba teszed
- Növeled a karakter számlálót, a kiírt szó hosszával, plusz egy a whitespace miatt.
- Ha az aktuális olvasott szó határa nem whitespace, hanem EOL, akkor a karakter számlálót megnöveled ezerrel, ezzel indukálod a következő sor azonnali életbe lépését.
- Ha a karakter számláló nagyobb mint a határ (nálad 80 karakter), akkor kiírod az aktuális puffert a sor számláló értékével prefixelve, majd sor számláló növelés, karakter számláló nullázás, puffer ürítés, aztán a pufferhez hozzáadod az aktuális változót (az utoljára olvasott szót, amivel együtt már több lett volna a sor mint 80 karakter).
- ha nem lett kiírva a puffer, akkor a puffer végére írod az aktuális szót.
- EOF esetén még kiírod az utolsó szót és a buffer tartalmát, majd kilépsz a ciklusból.
Ha magyar szöveg, lehet cizellálni, hogy vessző esetén érdemes hamarabb törni a sort, vagy két sor puffer, és ha a második sor csak egy-két szó, akkor az előző sorból áthozni tartalmat, hogy ne legyen túl rövid a sor, stb.
Ha nincs más megírom perlben 😀
Perl, substr, meg valami tömb, meg egy ciklusban inkrementált érték. Tök egyszerű.
"Ha az aktuális olvasott szó határa nem whitespace, hanem EOL, akkor a karakter számlálót megnöveled ezerrel, ezzel indukálod a következő sor azonnali életbe lépését." - heti "worst practice" adagunkat hallottuk...
így?
echo "Van egy pár soros szöveg amit szeretnék max 80 karakterre szétszedni úgy, hogy közben a sorokat számoljuk.
Tehát ha most ezt mint a második sort is számolom akkor úgy látom, hogy már ez több mint 80 karakter, tehát ideje lenne szétkapni." | sed -E 's/(^.{80}[^ ]+\b)/\1\n/gm;t;d' | nl
lehetne finomitani gondolom ....
és tényleg:
| sed -E 's/(^.{80}\S+\W)/\1\n/g' | nl -s '.'
Ez jó lesz, tökéletes! :)
Nem egészen értem mit akarsz. 80 karakter széles wrappinget, de szóhatáron (soft/word wrapping), vagy szó közben is jó (hard/fix wrapping). Ezzel a sorszámolással sem értem mit akarsz, nem számozást értesz alatta? Muszáj 4 sorosnak lennie? 4 sor után üres sor vagy mi jönne?
Tényleg nem értetlenkedni akarok, de nem tudom elképzelni pontosan. Mert pl. honnan tudod, hogy a szövegben nincsenek 4×80 karakternél hosszabb sorok, amit 80 karakterenként csak 4-nél több sorra fogsz tudni eltörni. Azt se ártana tudni, hogy mihez kell ez neked? Mert a 80 soros limit ma már nem egy életszerű limit. Mert ha valami grafikus szövegre kell, akkor pl. a TeX, LaTeX elég szépen tudja úgy törni a szöveget, hogy szépek legyenek a sorok, ne legyenek aránytalanok a szóközök, ha kell, tud elválasztást, elválasztási kivételt is.
“A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)
Szerintem van egy hosszú sorokból álló szövege, aminél meg szeretné tudni, hogy max. 80 karakteres sorokra tördelve hány sort tesz ki. (Ilyen/hasonló feladatot én is adtam - igaz sok-sok-sok éve - aláíráspótlós diákomnak...)
A max. 80 karakter az "fmt -80 -s textfile.txt", ha a sorok számát is elé akarjuk rakni, akkor mondjuk "fmt -80 -s textfile.txt | awk '{printf "%d %s\n", NR, $0}'" , de ha csak aza kérdés, hogy hány, maximum 80 karakteres sorba fér el, akkor fmt -80 -s textfile.txt | wc -l
Karakteres felületre kell és Slackware csomaghoz, hogy szép legyen a a csomagleírás, ezért akarom 80 karakterenként szétdobni a sorokat, soft/word wrapping módszerrel. Számolni meg azért kell, mert max 11 sor lehet a leírás.
Akkor még át kell egedni egy "head -11" -en
"Számolni meg azért kell, mert max 11 sor lehet a leírás." - Én ilyenkor fognék egy 80*25-ös konzolablakot, meg valami épkézláb texteditort, és belezutty a szöveget, és ott gyúrnám addig a szöveget, amíg a 80 oszlop és 11 sor limitbe bele nem fér. Mert ha az áttördelés után több, mint 11 sor, akkor úgyis újra kell fogalmazni...
Belefér a 11 sorba. Szerintem nincs olyan csomag aminél eddig láttam volna a határt. De a számolás azért kell, mert az üres sorokat is ki kell íratni utána.
>This file can have a maximum of eleven (11) lines of text preceded by ...
szerintem nem kell
De kell, majd közzéteszem, hogy miért. Legalábbis nekem kell :)
A kolléga úgy érti, hogy nem kötelező, mert szerintem az ezt kezelő toolok simán beolvasnak akármilyen plain text leírást, max 80 oszlopnál törnek és 11 sor után vágnak, de nem futnak hibába, ha a te leírásod ennél több, csak annyi lesz az esztétikai kényelmetlenség, hogy a vége nem fog látszani a leírásnak. Egy másik szálban egyébként írtam megoldást, fold | head, teszteltem, működik simán shellben.
“A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)
Ha csak ennyi a cél, akkor elég ezt futtatni a shellben, vagy egy shell scripteben:
cat file-od | fold -s -w 80 | head -11
“A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)
Kártyára akarod lyukasztani?
Dehogy!
Házi feladat :-D
disclaimer: ha valamit beidéztem és alá írtam valamit, akkor a válaszom a beidézett szövegre vonatkozik és nem mindenféle más, random dolgokra.
Mi a gond a hazi feladattal? Manapsag a munkat is hazi feladatkent jelentkezik... :-)