Использование Sed для замены массива - PullRequest
0 голосов
/ 03 марта 2020
#!/bin/bash
path_initial_case="/home/frederickthegreat/Desktop/Working Airfoil OpenFoam/Airfoil2D/"
path_output="/home/frederickthegreat/Desktop/"
initialvarray=(51 0 0)
angles=(0 2 4 6)
numberofcases=${#angles[*]}
velocity=30
i=0
pi=3.14159

while [ $i -lt $numberofcases ]
  do
  currentcase=${angles[i]}
  echo "$currentcase case"
  rad=$(bc -l <<< "scale=5; ($currentcase * $pi) / 180")
  echo "$rad rad "
  xcomp=$(bc -l <<< "scale=5; c(($currentcase * $pi) / 180) * ($velocity)")
  echo "$xcomp x"
  ycomp=$(bc -l <<< "scale=5; s(($currentcase * $pi) / 180) * ($velocity)")
  echo "$ycomp y"
  finalvarray=($xcomp $ycomp 0)
  echo ${finalvarray[@]}
  mkdir "Angle $currentcase"
  mkdir "Angle $currentcase"/"system"
  cp -r "${path_initial_case}"/"system/"*  "${path_output}""Angle $currentcase"/"system"
  mkdir "Angle $currentcase"/"0"
  cp -r "${path_initial_case}"/"0/"* "${path_output}""Angle $currentcase"/"0"
  sed -i "s/${initialvarray}/${finalvarray}/g" "${path_output}""Angle $currentcase"/"0/U"
  mkdir "Angle $currentcase"/"constant"
  cp "${path_initial_case}"/"constant/"* "${path_output}""Angle $currentcase"/"constant"
  ln -s "$path_initial_case""constant/polyMesh" "${path_output}""Angle $currentcase"/"constant"
  ((i++))
  echo "$i i"
done

В этом сценарии команда sed используется для замены массива в другом документе. Начальный массив определяется как initialvarray. Окончательный массив, finalvarray, для которого он заменяется, вычисляется внутри l oop. Проблема в том, что в документе заменяется только первый элемент массива. Я хотел бы, чтобы начальный массив был полностью заменен окончательным массивом ex. начальный массив (0 0 0), последний (1 1 1), и результат в документе должен быть (1 1 1).

1 Ответ

2 голосов
/ 03 марта 2020

Попробуйте, и вы поймете ошибку вашего кода выше:

array=(1 2 3)
echo $array

Вывод будет

1

, а не

(1 2 3)

Я предлагаю изменить initialvarray и finalvarray из массива в строку следующим образом:

initialvarray="(51 0 0)"
...
finalvarray="($xcomp $ycomp 0)"
...