Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]  (Přečteno 3827 krát)

marti..org

  • Návštěvník
  • Příspěvků: 41
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.
« Poslední změna: 13 Března 2011, 22:46:33 od Tadeáš Pařík »

premet

  • Host
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #1 kdy: 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
« Poslední změna: 13 Března 2011, 18:17:04 od Honza Grulich »

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #2 kdy: 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
« Poslední změna: 13 Března 2011, 19:15:42 od GdH »

Kedrigern

Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #3 kdy: 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>

premet

  • Host
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #4 kdy: 13 Března 2011, 20:10:25 »
Kód: [Vybrat]
man dirname
Tak jsem si aspoň zopakoval regulární výrazy  ;D

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #5 kdy: 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' ;)

premet

  • Host
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #6 kdy: 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 "/"  :)

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #7 kdy: 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íš :)

marti..org

  • Návštěvník
  • Příspěvků: 41
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #8 kdy: 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?

premet

  • Host
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #9 kdy: 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  :)
« Poslední změna: 13 Března 2011, 22:01:36 od Honza Grulich »

marti..org

  • Návštěvník
  • Příspěvků: 41
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #10 kdy: 13 Března 2011, 22:36:46 »
Jo takhle funguje
dík

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re: Bash - (sed/awk) - odstranění posledního sloupce [vyřešeno]
« Odpověď #11 kdy: 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 :)
« Poslední změna: 14 Března 2011, 11:52:02 od GdH »

 

Provoz zaštiťuje spolek OpenAlt.