Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: marti..org 13 Března 2011, 16:53:12

Název: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: marti..org 13 Března 2011, 16:53:12
Ahoj
potřeboval bych poradit s regulárním výrazem pro sed/awk.
Mám textový soubor který obsahuje cesty k souborům př:
/slozka/slozka/podslozka/soubor1
/slozka/podlozka/soubor2
/slozka/soubor3

Potřeboval odstranit název souboru (znaky za posledním lomítkem na řádku) a vůbec nevim jak na to.
Dík za radu.
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: premet 13 Března 2011, 18:15:01
Zkus
Kód: [Vybrat]
echo "/foo/bar/foo.txt" | sed 's/\(\/.*\/\).*/\1/'
Takže v souboru
Kód: [Vybrat]
sed 's/\(\/.*\/\).*/\1/g' soubora pokud chceš změnu přímo v něm tak sed -i
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: GdH 13 Března 2011, 18:54:04
Kód: [Vybrat]
man dirname
Může se hodit :)

Ještě mě napadlo toto:

Kód: [Vybrat]
grep -o "/.*/" soubor
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: Kedrigern 13 Března 2011, 20:09:47
Popřípadě, kdybys to chtěl v tom awk:
Kód: [Vybrat]
awk 'BEGIN {FS="/";} /^\// { for( i=2; i < NF; i=i+1) { printf FS $i } printf "/\n" }' <filename>
S tím, že to přeskakuje řádky, co nejsou adresy.

Popřípadě takhle bez koncových lomítek:
Kód: [Vybrat]
awk 'BEGIN {FS="/";} /^\// { for( i=2; i < NF; i=i+1) { printf FS $i } printf "\n" }' <filename>
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: premet 13 Března 2011, 20:10:25
Kód: [Vybrat]
man dirname
Tak jsem si aspoň zopakoval regulární výrazy  ;D
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: GdH 13 Března 2011, 20:18:12
Kód: [Vybrat]
man dirname
Tak jsem si aspoň zopakoval regulární výrazy  ;D

Já si to taky na těhle dotazech oživuju :) Mimochodem ten tvůj sed může být kratší, třeba takto:
Kód: [Vybrat]
sed 'ss\(/.*/\).*s\1s' ;)
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: premet 13 Března 2011, 20:20:54
Já si to taky na těhle dotazech oživuju :) Mimochodem ten tvůj sed může být kratší, třeba takto:
Kód: [Vybrat]
sed 'ss\(/.*/\).*s\1s' ;)
Jo tak tohle je detail, já jsem zvyklej používat "/"  :)
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: GdH 13 Března 2011, 20:35:23
Já si to taky na těhle dotazech oživuju :) Mimochodem ten tvůj sed může být kratší, třeba takto:
Kód: [Vybrat]
sed 'ss\(/.*/\).*s\1s' ;)
Jo tak tohle je detail, já jsem zvyklej používat "/"  :)

Je to detail, který zlepšuje přehlednost, takže když lomítko překáží, použiju jiný delimiter, protože cpát tam zpětná lomítka navíc jako escape znaky nedává smysl. Ale to ani tak nepíšu tobě, ty to víš :)
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: marti..org 13 Března 2011, 21:45:16
Ahoj díkěju všem, naprosto parádní.
přesně nějaký ten výraz pro ten sed jsem měl namysli. Ale ten příkaz dirname mě naprosto dostal :D

sed 's/\(\ /.*\ /\).*/\1/'
Jen jestli jsem tento příkaz správně pochopil tak já substituji (/.*/).*  - za všechny bloky textu uzavřené / /
a že to nachrazuji za \1 tak to je nějaký způsob reverze, že právě tu substituci si nechám a zbytek zahodím?
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: premet 13 Března 2011, 21:58:05
Když si tohle
Kód: [Vybrat]
sed 's/\(\/.*\/\).*/\1/'přepíšu na
Kód: [Vybrat]
sed 's@\(/.*/\).*@\1@'kde @ jsou oddělovače, tak to funguje tak, že mezi prvníma @ je to co se nahrazuje a mezi druhýma je čím nahrazuješ
Potom co je mezi \( \) to pak vyvoláš tou \1, takže hledám řetězec ve tvaru /.*/, kdy . je libovolný znak a * je 0 až nekonečně mnoho výskytů a potom to co je po /.*/ jako to .* druhý tak to je ten tvůj řetezec, kterýho se chceš zbavit. No a pak to celý jen přepíšeš tím řetězcem \1 v těch závorkách  :)
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: marti..org 13 Března 2011, 22:36:46
Jo takhle funguje
dík
Název: Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
Přispěvatel: GdH 13 Března 2011, 23:00:44
Zkusil bych to doplnit, kdyby to někdo nepobral :) Sed umožňuje v regulárním výrazu definovat pomocí kulatých závorek subřetězce, které je možné dále použít. První takový řetězec je \1, druhý \2, atd. Kulaté závorky je nutné escapovat pomocí zpětného lomítka, aby se nebraly jako součást regulárního výrazu. Například

Kód: [Vybrat]
echo 'celou fidorku mi sežral!'| sed "s/\(c\).*\(f\).*do.*\(k\)\(u\).*/\2\4\1\3/"
Regulární výraz je c.*f.*do.*ku.* a v něm jsem definoval čtyři subřetězce, jimiž řetězec daný regulárním výrazem nahradím a ulevím si :)