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.
- 633 megtekintés
Hozzászólások
AL
- A hozzászóláshoz be kell jelentkezni
Megnézem, köszönöm.
- A hozzászóláshoz be kell jelentkezni
Ott a pont: fmt -80 -s textfile.txt
- A hozzászóláshoz be kell jelentkezni
- 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.
- A hozzászóláshoz be kell jelentkezni
Ha nincs más megírom perlben 😀
- A hozzászóláshoz be kell jelentkezni
Perl, substr, meg valami tömb, meg egy ciklusban inkrementált érték. Tök egyszerű.
READY.
▓
- A hozzászóláshoz be kell jelentkezni
"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...
- A hozzászóláshoz be kell jelentkezni
í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 ....
- A hozzászóláshoz be kell jelentkezni
és tényleg:
| sed -E 's/(^.{80}\S+\W)/\1\n/g' | nl -s '.'
- A hozzászóláshoz be kell jelentkezni
Ez jó lesz, tökéletes! :)
- A hozzászóláshoz be kell jelentkezni
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.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Akkor még át kell egedni egy "head -11" -en
- A hozzászóláshoz be kell jelentkezni
"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...
- A hozzászóláshoz be kell jelentkezni
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.
HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
appname: appname (Short description of the application)
appname: <this line is generally left blank>
appname: Description of application - this description should be fairly
appname: in-depth; in other words, make it clear what the package does (and
appname: maybe include relevant links and/or instructions if there's room),
appname: but don't get too verbose.
appname: This file can have a maximum of eleven (11) lines of text preceded by
appname: the "appname: " designation.
appname:
appname: It's a good idea to include a link to the application's homepage too.
appname:
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
De kell, majd közzéteszem, hogy miért. Legalábbis nekem kell :)
- A hozzászóláshoz be kell jelentkezni
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.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
- A hozzászóláshoz be kell jelentkezni
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
“The world runs on Excel spreadsheets.” (Dylan Beattie)
- A hozzászóláshoz be kell jelentkezni
Kártyára akarod lyukasztani?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Mi a gond a hazi feladattal? Manapsag a munkat is hazi feladatkent jelentkezik... :-)
- A hozzászóláshoz be kell jelentkezni