Portál AbcLinuxu, 27. dubna 2024 06:03


Dotaz: Bash - Jak odstranit část cesty

3.2.2019 23:57 Janek
Bash - Jak odstranit část cesty
Přečteno: 445×
Odpovědět | Admin
Dobrý večer, nevím jak mám z proměné odstranít string (různé délky) za posledním lomítkem (včetně posledního lomítka). Děkuji

Řešení dotazu:


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

Odpovědi

4.2.2019 00:12 debian+
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
Odpovědět | | Sbalit | Link | Blokovat | Admin
https://www.tldp.org/LDP/abs/html/string-manipulation.html
4.2.2019 00:14 Vlado
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
dirname
4.2.2019 00:21 Janek
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pánové mám v zadání chybu, omlouvám se. Potřebuji odstranit z proměné string (různé délky) před posledním lomítkem (včetně posledního lomítka). Děkuji
4.2.2019 00:37 Janek
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
Raději uvedu ještě příklady. Tučně označené znaky potřebuji z proměnné odstranit. Děkuji
sffs/
asdasd/gfdsfsdf/asdsadas/
gdgdfg/asdsadasd/fsddgfd/asdsadasds/fsdfdff/sdfdfsdfg/
Jendа avatar 4.2.2019 01:18 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
$ echo gdgdfg/asdsadasd/fsddgfd/asdsadasds/fsdfdff/sdfdfsdfg/ | rev | cut -d / -f 3- | rev
gdgdfg/asdsadasd/fsddgfd/asdsadasds/fsdfdff
4.2.2019 01:51 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty

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
4.2.2019 01:58 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty

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í. :-)

4.2.2019 02:02 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty

extglob je tam teď samozřejmě na houby — copy&paste chyba.

k3dAR avatar 4.2.2019 14:57 k3dAR | skóre: 62
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
v podstate je tam na houby i to echo :-) chapu ze se striktne drzis prikladu kde vypada ze na konci chce mit /, ale vem to z praxe, to pak bude pouzivat ${zjistenej_adresar}${soubor_v_nem}, nebo citelneji ${zjistenej_adresar}/${soubor_v_nem} s tim ze se to interpretuje pak jako // i kdyz to nejspis nicemu nevadi... z praxe je podle me vhodne mit konec promene bez / a lomitko davat v pripade potreby az za tu promenou.
cesta='asdasd/gfdsfsdf/asdsadas/'
dirname "${cesta}"
porad nemam telo, ale uz mam hlavu... nobody
4.2.2019 23:18 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty

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.

Řešení 1× (camel1cz)
4.2.2019 01:01 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
basename
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
4.2.2019 23:10 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty

Ne, dirname.

4.2.2019 14:19 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
Odpovědět | | Sbalit | Link | Blokovat | Admin
echo "${string%/*/}"
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
4.2.2019 23:16 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty

Plus / na konec…

4.2.2019 15:28 PetebLazar
Rozbalit Rozbalit vše Re: Bash - Jak odstranit část cesty
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nestačí pouze k řetězci přidat "../"? ;-)

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.