Portál AbcLinuxu, 15. května 2025 22:16
Řešení dotazu:
sffs/ asdasd/gfdsfsdf/asdsadas/ gdgdfg/asdsadasd/fsddgfd/asdsadasds/fsdfdff/sdfdfsdfg/
$ echo gdgdfg/asdsadasd/fsddgfd/asdsadasds/fsdfdff/sdfdfsdfg/ | rev | cut -d / -f 3- | rev gdgdfg/asdsadasd/fsddgfd/asdsadasds/fsdfdff
Jednoduchý příklad:
shopt -s extglob cesta='asdasd/gfdsfsdf/asdsadas/' echo "${cesta%%*([^/])/}"
Podrobněji k tématu:
cesty=( [0]='sffs/' [1]='asdasd/gfdsfsdf/asdsadas/' [2]='gdgdfg/asdsadasd/fsddgfd/' [2]+='asdsadasds/fsdfdff/sdfdfsdfg/' ) # Toto je jen pro jistotu; bývá to zapnuté: shopt -s extglob # Pouze výpis pozměněných cest: for cesta in "${cesty[@]}"; do # První možnost: echo "'${cesta}' -> '${cesta%%*([^/])/}'" # Druhá možnost: echo "'${cesta}' -> '${cesta/%*([^\/])\/}'" done # Transformace pole cest do nových polí: bez_konce_1=("${cesty[@]%%*([^/])/}") bez_konce_2=("${cesty[@]/%*([^\/])\/}") # Výpis pro kontrolu: for index in "${!cesty[@]}"; do echo "'${cesty[index]}' -> '${bez_konce_1[index]}'" echo "'${cesty[index]}' -> '${bez_konce_2[index]}'" done
Nebo pokud je v tom cvičení povolený dirname
tak takhle:
shopt -s extglob cesta='asdasd/gfdsfsdf/asdsadas/' echo "$(dirname "${cesta}")/"
dirname
se dá taky použít s těmi poli a dalšími triky výše. Ale pozor, dirname
nemusí nutně každý považovat za (čistý) Bash, takže záleží na zadání.
extglob
je tam teď samozřejmě na houby — copy&paste chyba.
cesta='asdasd/gfdsfsdf/asdsadas/' dirname "${cesta}"
Ano, s lomítkem je to složité, zejména když přijde na to, jaký speciální význam mu dává třeba rsync
.
Tady jsem vycházel z toho, že zadání prostě vyžaduje lomítko.
Ne, dirname
.
echo "${string%/*/}"
Plus /
na konec…
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.