Fórum Root.cz
Hlavní témata => Software => Téma založeno: Doktor 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?
-
Chce to se problému chvíli věnovat, už sis na to SED? :P
-
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 ;)
-
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.
-
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:)
-
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.
-
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
-
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?
-
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?
-
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?
-
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, ...)
-
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.
-
Odstraneni opakujicich se prazdnych radku: cat -s soubor.txt
-
Nádhera! Díky moc všem za odpověď, teď má ten text správnou podobu. Ještě jednou díky!