Parece que esto fue un problema con mi configuración--El corrimiento al rojo parece bloquear \e]R
para que no funcione.
В bash
вы должны иметь возможность применить глобальную замену параметров к элементу массива:
$ Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb
См. например Поиск и замена :Массивы
Я предполагаю, что вы хотите сделать это вbash
(или вы не будете использовать массив, чтобы начать с ).
$ echo "${Array[@]//__SingleQuote__/\'}"
Mary had a 'little' lamb
$ printf '%s\n' "${Array[@]//__SingleQuote__/\'}"
Mary
had a 'little'
lamb
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb
В приведенном выше примере используется замена шаблона ${parameter//pattern/text}
для замены всех вхождений __SingleQuote__
одинарными кавычками. При применении к массиву операция выполняется над каждым элементом отдельно.
В оболочке POSIX, где у нас есть только один массив,$@
:
set -- "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb"
i=0
while [ "$i" -ne "$#" ]; do
set -- "$@" "$( printf '%s\n' "$1" | sed "s/__SingleQuote__/'/g" )"
shift
i=$(( i + 1 ))
done
printf '%s\n' "$@"
При этом изменяется набор позиционных параметров путем подачи каждого отдельного параметра через sed
для преобразования строки-заполнителя в символ одинарной кавычки. Он модифицирует первый позиционный параметр и добавляет результат в конец $@
. Затем он сдвигает первый параметр из массива и повторяется до тех пор, пока не будут обработаны все элементы.
Вышеизложенное даст
Mary
had a 'little'
lamb
Конечно, это напечатает то, что вы просите:
printf '%s\n' "${Array[@]//__SingleQuote__/\'}"
Но поскольку вы запрашиваете новый массив с исправленными значениями, используйте:
ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
Конечно, индексы ConvertedArray будут числовыми от 0 и выше. Кажется, это не проблема, но поскольку вы упомянули об этом в комментариях (к другому ответу ), продолжайте читать.
Если массив определен как:
$ Array=( [2]="Mary" [5]="had a __SingleQuote__little__SingleQuote__" [8]="lamb" )
Тогда массив разреженный (имеет несколько дыр):
$ declare -p Array
declare -a Array=([2]="Mary" [5]="had a __SingleQuote__little__SingleQuote__" [8]="lamb")
Чтобы решить эту проблему, вам понадобится петля:
$ for i in "${!Array[@]}"; do
> ConvertedArray[i]="${Array[i]//__SingleQuote__/\'}"
> done
$ declare -p ConvertedArray
declare -a ConvertedArray=([2]="Mary" [5]="had a 'little'" [8]="lamb")
И
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb