Portál AbcLinuxu, 8. května 2025 22:08

Dotaz: sed

27.3.2009 14:27 mira
sed
Přečteno: 963×
Odpovědět | Admin

Ahoj,

potrebuju udelat par ukolu pomoci sedu (nebo edu) a u nekterych z nich nevim poradne jak na to :(

1) odstranit radky s komentari (znak #), resp. pokud znak # neni na zacatku radku, pak odstranit jenom znaky od # do konce radku (vcetne #)

napadlo me sed soubor -e s/\(#.*\)//, jenomze tento prikaz radek s komentarem neodstrani - zustane prazdny radek

2) odstranit bile znaky pred interpunkci

toto je pro me jeste vetsi zahada - ruzne jsem to zkousel a testoval jak to funguje, ale jedine, ceho jsem dosahl bylo, ze sed vymenil prvni vyskyt mezery v souboru

vymyslel jsem sed soubor -e s/[[:space:]]+\([.,\!?]+\)/\1/, ale to nefunguje vubec

Dekuju Mira

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

27.3.2009 15:12 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: sed
Odpovědět | | Sbalit | Link | Blokovat | Admin
ad 1) použít něco jako /^#/d

ad 2) přidat na konec volbu g (viz man)
I am always ready to learn although I do not always like to be taught. (W. Churchill)
27.3.2009 20:15 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed
ad 2) není problém v g, neboť + značí jeden a více výskytů, takže na toto stačí správně escapovat:

sed -e "s/[[:space:]]\+\([.,\!?]\+\)/\1/" soubor
27.3.2009 20:24 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed
Pokud by se vám to zdál právem opruz, použijte extended regexp čímž m. j. omezíte escapování:

sed -r -e "s/[[:space:]]+([.,\!?]+)/\1/" soubor
Michal Wirth avatar 27.3.2009 20:37 Michal Wirth | skóre: 26
Rozbalit Rozbalit vše Re: sed
Odpovědět | | Sbalit | Link | Blokovat | Admin
1) treba takto sed soubor 's/^\([^#]*\)#.*$/\1/', mozna ale existuje elegantnejsi reseni, toto je prvni, co me napadlo ;-)

2) nepremyslel jsem nad tim, ale nevidim tam priznak g, takze to bude asi ten problem

BTW prikazy pro sed davejte radeji mezi apostrofy, vyhnete se tak problemum
Důležité se časem stává absurdním, absurdní se časem mění v důležité.
27.3.2009 20:54 cronin | skóre: 49
Rozbalit Rozbalit vše Re: sed
BTW prikazy pro sed davejte radeji mezi apostrofy, vyhnete se tak problemum
Tato rada je vo vseobecnosti rovnako zla, ako rada opacna. Neraz treba do patternu expandovat nejaku premennu, a vtedy apostrofy pouzit nejdu. Pattern sed-u je jedna vec, expanzia shellu je vec druha. Nanestastie sa tieto dve veci ovplyvnuju, ale nastastie su ortogonalne. Takze ich len treba poznat a pouzivat pripad od pripadu podla potreby. Subjektivne uznavam, ze pripadov kedy apostrofy pouzit idu - a teda umoznuju vyhnut sa shell escapovaniu - je viac, ako ked pouzit nejdu. :-D
27.3.2009 23:16 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed
Dopourčuji všude používat ", aspoň "vás" to naučí co escapovat až to někdy bude fakt potřeba ;) ;) ;)
27.3.2009 23:10 Ash | skóre: 53
Rozbalit Rozbalit vše Re: sed
1) elegantnější řešení už zaznělo v dotazu (nahradit #.* nicem)

2) nebude, používá základní regexp a tam sed akorát trochu víc bazíruje na escapování než je někdo zvyklý
29.3.2009 11:20 mira
Rozbalit Rozbalit vše Re: sed
Odpovědět | | Sbalit | Link | Blokovat | Admin

Diky,

uz to funguje perfektne :)

K uvozovkam - puvodne jsem je tam mel, ale (asi) shell je odstranil, kdyz jsem si ty prikazy echoval do souboru.

Mira

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.