我需要设置bash脚本来初始化文件中某些BC的帮助。理想情况下,我的程序将遍历每一行并:
1)读入BC类型-(壁,出口,入口)。
2)根据适当的BC类型更改“类型”字段。
不幸的是,我的程序似乎替换了步骤2中的所有类型字段,而不仅仅是与正确的BC相关联的类型字段。
我认为这与在整个文件而不是$ line变量上运行的sed命令有关。
while IFS= read -r line || [[ -n "$line" ]]; do #go through each line of T2 file
if [[ $line == *wall_* ]] #if wall_*
then
echo "attempted to assign wall_*"
var=1 #wall #Go down 2 lines
elif [[ $line == *velocity-inlet* ]]
then
echo "attempted to assign outflow"
var=2 #inlet
elif [[ $line == *outflow* ]]
then
var=3 #outlet
fi
echo $var
if [[ $line == *type* && $var == 1 ]]
then
sed -i 's/.*type.*/type zeroGradient/' 0/T3
echo "Attempted wall zeroGradient"
elif [[ $line == *type* && $var == 2 ]]
then
sed -i 's/.*type.*/type fixedValue\nvalue uniform (3 0 0)/' 0/T3
elif [[ $line == type* && $var == 3 ]]
then
sed -i 's/.*type.*/type zeroGradient/' 0/T3
fi
sed -i '/nFaces*/d' 0/T3 #Deletes irrelevant stuff from boundary file copy
sed -i '/startFace*/d' 0/T3
done <0/T3.
例如,应该更改它:
velocity-inlet_1
{
type patch;
nFaces 336;
startFace 75515;
}
outflow_2
{
type patch;
nFaces 136;
startFace 75851;
}
收件人:
velocity-inlet_1
{
type fixedValue;
value uniform (3 0 0);
}
outflow_2
{
type zeroGradient;
}
但是将其更改为错误地将其更改为:
velocity-inlet_1
{
type fixedValue;
value uniform (3 0 0);
}
outflow_2
{
type fixedValue;
value uniform (3 0 0);
}
帮我堆栈溢出,你是我唯一的希望。
答案 0 :(得分:0)
您遇到了一些问题。 sed默认情况下会影响整行,而您首先并没有告诉它要修改哪一行。您还在读取文件时对其进行了修改。我可能会喜欢这样的东西:
var="none"
while IFS= read -r line; do
if [[ "$line" =~ "wall" ]]; then
var=wall
elif [[ "$line" =~ "velocity-inlet" ]]; then
var=inlet
fi
if [[ "$line" =~ "type" && "$var" == "wall" ]]; then
echo "$line" | sed 's|\(type *\).*|\1zeroGradient|'
elif [[ "$line" =~ "type" && "$var" == "inlet" ]]; then
echo "$line" | sed 's|\(type *\).*|\1uniform (3 0 0)|'
else
echo "$line"
fi
done
然后做
script.sh < 0/T3 > 0/T3.mod
您当然可以将其修改为也可以从特定文件读取/写入,并且可以避免sed(请参见here...)