Odstranění zalamování řádků

Doktor

Odstranění zalamování řádků
« kdy: 13. 03. 2011, 23:32:21 »
Zdravím všechny zdejší borce, mám další technický problém: dostal se mi do ruky velký text, který je ale špatně formátovaný - má pevné entery zhruba po 80 znacích. Nejsou tam tedy klasické "nekonečné" řádky, které se zalamují na obrazovce samy a vytvářejí tak přirozeně odstavce, ale jsou to tisíce krátkých řádků po přibližně 80 znacích. Reálné odstavce jsou správně na začátku označeny čtyřmi mezerami.

Otázka tedy zní: Jak odstranit ta přebytečná zalomení? Neboli - jak jednoduše udělat skript, který bude dělat toto: "Pokud řádek začíná znakem, zruš předchozí zalomení řádku. Pokud řádek začíná čtyřmi mezerami (třeba), předchozí zalomení řádku nechej."

Cílem je tedy udělat z toho text, u kterého platí - co odstavec, to jeden dlouhý řádek textu. Existuje nějaký jednoduchý postup?


RomanF

Re: Odstranění zalamování řádků
« Odpověď #1 kdy: 14. 03. 2011, 07:49:36 »
Chce to se problému chvíli věnovat, už sis na to SED?  :P

pecko

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re: Odstranění zalamování řádků
« Odpověď #2 kdy: 14. 03. 2011, 08:00:40 »
za nekonecne riadky sa usekavaju ruky. napriek tomu aj ja sam tak pisem:D ale faktom ostava, ze konvencia kaze po priblizne 80 znakoch riadkovat. mysli sa tym zdrojovy kod. to kvoli prehladnosti. nemen to zbytocne:) ale ak na tom napriek tomu trvas, skus to, co pise kolega nado mnou:) sed ;)

Doktor

Re: Odstranění zalamování řádků
« Odpověď #3 kdy: 14. 03. 2011, 08:30:05 »
To ale není zdrojový kód, ale normální literatura. Pokud s tím textem chci pracovat, pak mám smůlu, protože je plný enterů. Jakýkoliv pokus o sazbu selže, protože jsou pevně dané řádky a neudělám nad tím odstavcový zlom. Díky za radu, ale se sedem neumím, nemůžete poradit blíže? Děkuju.

pecko

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re: Odstranění zalamování řádků
« Odpověď #4 kdy: 14. 03. 2011, 08:35:21 »
tak skus vyuzit moznosti tvojho editora a joini riadky. on ti to potom vsetko zgrcne do jednej lajny a potom si to naformatuj ako chces:) teda ak to vie. ak nie, skus ponahradzat konce riadkov nicim:) alebo si potrap hlavicku a skus prist na vlastny sposob:) moznosti mas viacero:)


RomanF

Re: Odstranění zalamování řádků
« Odpověď #5 kdy: 14. 03. 2011, 09:01:41 »
Jeden návod je tady:
http://www.unix.com/shell-programming-scripting/29910-use-sed-merge-multiple-lines.html
(Strýček Google poradí skoro vždy a Sed není podmínkou)

Lze určitě mnoha způsoby. Teď mě napadlo, jednoduché je spojit všechny řádky do jednoho a potom posloupnost několika mezer nahradit novým řádkem (\n) a několika mezerami.

RomanF

Re: Odstranění zalamování řádků
« Odpověď #6 kdy: 14. 03. 2011, 09:25:13 »
Sloučení do jednoho řádku:
sed ':a;N;$!ba;s/\n//g' vstup.txt > vystup_docasny.txt

Nahrazení mezeramezeramezera koncem řádku:
sed 's/\s\s\s/\n/g' vystup_docasny.txt > vystup.txt

Doktor

Re: Odstranění zalamování řádků
« Odpověď #7 kdy: 15. 03. 2011, 00:10:28 »
Perfektní! Ta poslední rada zabrala výborně. Děkuji moc.

Jen ještě jeden problém mám: mám tam na mnoha místech vícenásobné prázdné řádky. Prostě různá oddělení textů od sebe (obvykle kapitoly) prázdnými entery. Problém je, že je jich různý počet - od tří do jedenácti. Je ještě možnost tyhle prázdné řádky zredukovat vždy na jeden?

Re: Odstranění zalamování řádků
« Odpověď #8 kdy: 15. 03. 2011, 09:53:56 »
Perfektní! Ta poslední rada zabrala výborně. Děkuji moc.

Jen ještě jeden problém mám: mám tam na mnoha místech vícenásobné prázdné řádky. Prostě různá oddělení textů od sebe (obvykle kapitoly) prázdnými entery. Problém je, že je jich různý počet - od tří do jedenácti. Je ještě možnost tyhle prázdné řádky zredukovat vždy na jeden?

Ten první skript to odstraní, ne?

Doktor

Re: Odstranění zalamování řádků
« Odpověď #9 kdy: 15. 03. 2011, 10:01:13 »
Nojo, to je fakt. Měl by. Ale zůstane tam v některých místech halda mezer a ty se druhým příkazem zase natáhnou na entery. Asi by stačilo v tom druhém příkazu upravit na "když je tam víc mezer než tři, tak je všechny sežer a udělej enter". To by šlo?

Re: Odstranění zalamování řádků
« Odpověď #10 kdy: 15. 03. 2011, 10:26:47 »
Nojo, to je fakt. Měl by. Ale zůstane tam v některých místech halda mezer a ty se druhým příkazem zase natáhnou na entery. Asi by stačilo v tom druhém příkazu upravit na "když je tam víc mezer než tři, tak je všechny sežer a udělej enter". To by šlo?

Já osobně nahrazuju libovolný počet mezer jednou mezerou tak, že opakuju "náhradu dvou mezer jednou mezerou". Tak douho, dokud se nějaká ta dvojice najde.

Tento obecný postup určitě není optimalizovaný, ale funguje všude (vim, word, ...)

Doktor

Re: Odstranění zalamování řádků
« Odpověď #11 kdy: 15. 03. 2011, 10:36:37 »
Ale to tady nejde, protože potřebujeme zachovat čtyři mezery na začátku odstavce - podle nich odstavce identifikujeme. Takže je potřeba něco sofistikovanějšího, co pozná libovolný počet mezer, pokud je jich více než pět.

ams

Re: Odstranění zalamování řádků
« Odpověď #12 kdy: 15. 03. 2011, 11:12:21 »
Odstraneni opakujicich se prazdnych radku: cat -s soubor.txt

Doktor

Re: Odstranění zalamování řádků
« Odpověď #13 kdy: 15. 03. 2011, 11:14:53 »
Nádhera! Díky moc všem za odpověď, teď má ten text správnou podobu. Ještě jednou díky!