Portál AbcLinuxu, 26. dubna 2024 11:57


Dotaz: úprava konců řádek filtrem v proudu

Ondroid avatar 7.5.2005 23:46 Ondroid | skóre: 32 | blog: Hombre
úprava konců řádek filtrem v proudu
Přečteno: 66×
Odpovědět | Admin
Potřeboval bych v proudu co přichází z roury nahrazovat \r za \r\n. Zkoušel jsem to sedem ale ten zpracovává proud po řádcích a ty právě nejsou moc korekt, takže to nakešuje a nakonec vychrlí všechny řádky naráz - nezpracovává je kontinuálně. Nevíte jak na to ?
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.5.2005 00:00 Michal Čihař | skóre: 61 | blog: Bláboly | Praha
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Odpovědět | | Sbalit | Link | Blokovat | Admin
man sed
/unbuffered
Weblate - překládání přes web | Gammu SMSD - posílání SMS | Blog
Ondroid avatar 8.5.2005 00:17 Ondroid | skóre: 32 | blog: Hombre
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Tak s tím jsem taky neuspěl :(
Ondroid avatar 8.5.2005 00:47 Ondroid | skóre: 32 | blog: Hombre
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Rději pořádně popíšu o co se snažím. Potřebuju nějak plynule filtrovat výstup z rsync --progres soubor1 soubor2 - ten cyklicky vypisuje průběh přenosu a na konci je vždy /r takže je všechno stále na jednom řádku. Zkoušel jsem nejprve tedy použít | tr $'\r' $'\n' - to vše vypisuje po řádku jak má ale pokud to napojím třeba | awk ... tak opět dlouho nic a pak se vypíše sposta řádků naráz. Už nevím jak ty konce řádků upravit aby to šlo kontinuálně, tak jak to leze z toho rsyncu...
8.5.2005 08:12 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Nijak.

Stdout rsyncu je line-buffered, tj. výstup se pošle druhému programu v rouře, když je kompletní řádek (a nejspíš taky po překročení 4kB). IOW výstup se zapíše, teprve až přijde \n; \r může přijít kolik chce, ale řádek neukončí.
8.5.2005 11:30 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Můj rsync volá pokaždé fflush(stdout), ale sed i s optionem -u čeká na vstupu na konec řádku, nejspíš proto, že ty regexpy pracují s celými řádky. tr zase nemá option -u, takže do roury zapisuje po blocích (viz tr a b | cat). Jak100hoven? :-)
8.5.2005 15:39 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
#!/usr/bin/tcc -run
#include <stdio.h>
int main() {
    int c;
    setvbuf(stdin, NULL, _IONBF, 0);
    while ((c = getchar()) != EOF)
        putchar(c == '\r' ? '\n' : c);
    return 0;
}
8.5.2005 15:41 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Zapomněl jsem podotknout, že skript se jmenuje \r2\n.c ;-)
8.5.2005 17:18 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
:-)
+++ \r2\n.c.new 2005-05-08 17:16:35.179029032 +0200
@@ -3,6 +3,7 @@
 int main() {
     int c;
     setvbuf(stdin, NULL, _IONBF, 0);
+    setlinebuf(stdout);
     while ((c = getchar()) != EOF)
         putchar(c == '\r' ? '\n' : c);
     return 0;
8.5.2005 17:49 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
To je snad default, ne? Tedy pokud isatty(fileno(stdout)).
8.5.2005 17:51 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
No právě, on na to chtěl napojit awko. Na terminálu to funguje i s tr.
Ondroid avatar 8.5.2005 22:07 Ondroid | skóre: 32 | blog: Hombre
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Mezi tím jsem přišel taky na řešení i když dost primitivní a ne moc čisté :). Prostě to z toho rsyncu přesměruju do temp souboru a ten pak jiným procesem čtu, v tom souboru to je pak jeden šíleně dlouhý řádek ale už z toho jde odfiltrovat těch pár posledních znaků. Použiji ale stejně jeden z vašich návrhů, díky hoši...
Ondroid avatar 8.5.2005 22:28 Ondroid | skóre: 32 | blog: Hombre
Rozbalit Rozbalit vše Re: úprava konců řádek filtrem v proudu
Tohle dělá úplně stejnou věc jako to tr ne ?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.