Инвертирование пар ключей значения массива с помощью sed или замены шаблона или расширения фигурной скобки?

Если я понимаю Вас правильный, здесь пример:

Тишина:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
There's silence

Я включаю смелый:

fuser /dev/snd/timer && echo "Something is playing" || echo "There's silence"
/dev/snd/timer:      47663
Something is playing

Для OSS chande /dev/snd/timer кому: /dev/dsp.

Это - очень зависимый метод.

1
06.10.2013, 14:23
3 ответа

Я учел бы совет @ChrisDown и не попытался бы сделать что-то умное здесь. Я создал бы для цикла и инвертировал бы ключи со значениями в новом массиве. Это - только несколько строк кода.

Что-либо, что Вы создаете этим способом, будет более трудным для других поддерживать в будущем, и более трудный для Вас помнить/понимать, как он работает, когда Вы пересматриваете код в будущем.

4
27.01.2020, 23:21
  • 1
    Не берите в голову, что расширение оболочки для генерации входа к sed использует цикл удара внутренне так или иначе, таким образом, безотносительно причины Вы имеете для предотвращения итерации по массиву, потерян, с дополнительной потерей необходимости к fork() новый процесс для sed вдобавок ко всему –  dannysauer 06.10.2013, 22:20
#!/bin/bash
arr=(a b c d)
set -- $(echo ${arr[@]} | tr ' ' '\n' | sed "s/.*/arr['&']=/")
eval echo $(seq 1 ${#arr[@]} | sed 's/\(.*\)/${\1}$(echo \1 -1 | bc)/') 

или

#!/bin/bash
declare -A brr
arr=(a b c d)
eval "brr=($(eval echo $(sed 's/\([0-9]\)/[${arr[\1]}]=\1/g' <(echo ${!arr[@]}))))"
echo ${brr[@]}

Вывод:

#arr['a']=0 arr['b']=1 arr['c']=2 arr['d']=3
0
27.01.2020, 23:21

Как другие сказали, я думаю sed было бы трудное решение.

Следующий цикл мог выполнить то, что Вы хотите:

arr=(a b c d)
for i in ${!arr[@]}; do
    brr+=("[${arr[$i]}]=$i")
done
echo ${brr[@]}
#[a]=0 [b]=1 [c]=2 [d]=3
0
27.01.2020, 23:21

Теги

Похожие вопросы