Portál AbcLinuxu, 10. května 2025 16:22

Dotaz: Nahrazení hodnoty v array

5.3.2013 12:23 BLACK
Nahrazení hodnoty v array
Přečteno: 254×
Odpovědět | Admin
Zdravím všechny, snažím se vyřešit jeden pro mne celkem neřešitelný probém. Mám definované pole
ARR=(
"xxx" "xxxxxxxxxxxxxx"
"xxx" "xxxxxxxxxxxxxx"
"xxx" "xxxxxxxxxxxxxx"
"xxx" "ssssssssssssss"
"xxx" "xxxxxxxxxxxxxx"
"xxx" "xxxxxxxxxxxxxx"
)
A potřebuji nahradit v tomto poli hodnotu ssssssssssssss za xxxxxxxxxxxxxx. Neporadil by někdo jak to provéct v bash/shell? Děkuji
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

5.3.2013 14:28 GiGo
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Odpovědět | | Sbalit | Link | Blokovat | Admin
ARR[7]=xxxxxxxxxxxxxx
5.3.2013 16:44 Kit
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Odpovědět | | Sbalit | Link | Blokovat | Admin
V shellu se dobře dělá se soubory, ale práce s polem je v něm kostrbatá. Skutečně tu změnu potřebuješ dělat na poli?
5.3.2013 19:00 j
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Odpovědět | | Sbalit | Link | Blokovat | Admin
Chjo, co tak zkusit google? 10s ...
#!/bin/bash

ARR=(
"xxx" "xxxxxxxxxxxxxx"
"xxx" "xxxxxxxxxxxxxx"
"xxx" "xxxxxxxxxxxxxx"
"xxx" "ssssssssssssss"
"xxx" "xxxxxxxxxxxxxx"
"xxx" "xxxxxxxxxxxxxx"
)

x="ssssssssssssss"

len=${#ARR[@]}

for (( i=0; i< len; i++ ))
do
    if [ "${ARR[i]}" == "$x" ]
    then
        ARR[i]="kkk"
        echo ${ARR[i]}
    fi
done
5.3.2013 21:02 bashoid
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Proč to dělat jednoduše, když máme i bash:

ARR=${ARR[@]/ssssssssssssss/xxxxxxxxxxxxxx}
5.3.2013 21:46 bashoid
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Pardon, drobný nedoraz, jak říkám, je to velmi jednoduché:
ARR=("${ARR[@]/ssssssssssssss/xxxxxxxxxxxxxx}")
5.3.2013 21:47 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array

To nie je spravne riesenie, spravne je to nasledovne:

ARR=( "${ARR[@]/ssssssssssssss/xxxxxxxxxxxxxx}" )

alebo pre viac ako prvy vyskyt daneho retazca sssssssssssss je to nasledovne:

ARR=( "${ARR[@]//ssssssssssssss/xxxxxxxxxxxxxx}" )
5.3.2013 22:17 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Je otázka, jestli děláte opravdu to, co je zadáno.

Když někdo řekne že chce v poli změnit hodnotu ssss na xxxx, první mne napadne, že chce v těch prvcích pole, které mají hodnotu rovnu ssss nahradit jejich tuto hodnotu hodnotou yyyy.

Až když jste navrhl vaše řešení mne napadlo, že by v zadání mohlo jít o fulltextové nahrazování, hodnoty ve smyslu řetězce, nikoliv hodnoty prvku pole.

Takže záleží na tom, co je cílem. Abychom při nahrazování ryb kočkami nedostali velkočku.

Osobně tipuji že podle toho jak je to zadáno se mají opravdu nahrazovat ryby kočkami, ne velryby velkočkami.
5.3.2013 23:02 meta
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
V zadání je dokonce v tomto poli. Myslím, že literu zadání doslovně splnil i první humorista.
5.3.2013 23:03 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array

To je dobra poznamka a popravde dost dolezita, kedze je aj mojim nazorom, ze nahradzujeme hodnoty jednotlivych clenov pola. Ale co som opravil riesenie vyssie, je stale len nahradzovanie retazcov, kedy nahradenie retazca sss retazcom xxx plati aj pre aaasss a taktiez aj pre aaasssbbbssssss a podobne.

Riesenim pre nahradzovanie hodnot clenov pola by mohlo byt aj nasledovne:

patrik@thinkpad:~$ echo "${pole[@]}"
aaaccc bbb ccc dddcccddd ccc
patrik@thinkpad:~$ once=0; value1='ccc'; value2='xxx'; num=0; for item in "${pole[@]}"; do [[ "$item" == "$value1" ]] && { pole[$num]="$value2"; [[ "$once" -eq 0 ]] && break; }; (( num++ )); done
patrik@thinkpad:~$ echo "${pole[@]}" 
aaaccc bbb xxx dddcccddd ccc
5.3.2013 23:11 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Nahrazení hodnoty v array
Osobně v momentě, kdy stejně z technických důvodů potřebuji index, rezignuji na cool for item in array a udělám prostý for cyklus přes prvky toho pole indexované tím indexem jako je uvedeno v příspěvku č. 3 od j, připadá mi to i konzistentnější ve smyslu že nahrazuji s jistotou přesně to, co jsme před tím porovnal a našel shodu a tedy nahradit chtěl.

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.