Эффективный способ преобразования строки в одинарную кавычку в массиве в оболочке Linux

Parece que esto fue un problema con mi configuración--El corrimiento al rojo parece bloquear \e]Rpara que no funcione.

0
02.05.2018, 04:05
3 ответа

В bashвы должны иметь возможность применить глобальную замену параметров к элементу массива:

$ Array=( "Mary" "had a __SingleQuote__little__SingleQuote__" "lamb" )
$ ConvertedArray=( "${Array[@]//__SingleQuote__/\'}" )
$ printf '%s\n' "${ConvertedArray[@]}"
Mary
had a 'little'
lamb

См. например Поиск и замена :Массивы

3
28.01.2020, 02:16

Я предполагаю, что вы хотите сделать это в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
1
28.01.2020, 02:16

Конечно, это напечатает то, что вы просите:

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    
1
28.01.2020, 02:16

Теги

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